如何在没有异步/等待的情况下从待解决的承诺中获取数据?

2023-11-25

我有抽象:

function fetchDataFromAPI() {
  const url = `https://api...`
  return fetch(url).then(response => response.json())
}

我想在我的其他代码中使用它,例如:

if(something){
  const data = fetchDataFromAPI()
  return data 
}

if I console.log我得到的数据已解决待定承诺

Promise {<pending>}
  __proto__: Promise
  [[PromiseStatus]]: "resolved"
  [[PromiseValue]]: Object

我如何获取该对象data而不是承诺?


你不能。原因如下:

Promise 是一种语言构造,它使 JavaScript 引擎能够继续执行代码,而无需等待内部函数(也称为执行器函数)的返回。 Promise 始终在事件循环内运行。

var p = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('foo');
  }, 300);
});

console.log(p);

基本上,promise 是回调的美化语法糖。我们将看到如何做,但首先让我们有一个更现实的代码:

function someApiCall(){
  return new Promise(function(resolve, reject){
    setTimeout(()=>{
      resolve('Hello');
    })
  })
}

let data = someApiCall();

console.log(data);

这是所谓的异步代码,当 JavaScript 引擎执行它时,someApiCall 立即返回结果,在本例中是待处理的 Promise:

> Promise {<pending>}

如果您注意执行器,您会发现我们需要传递解析和拒绝参数(即回调)。是的,它们是语言构造所需的回调。当他们中的任何一个调用时,promise 将改变其状态并因此得到解决。我们不称其为已解决,因为解决意味着成功执行,但函数也可能出错。

我们如何获取数据?好吧,我们需要更多回调,一旦 Promise 解决,执行器函数就会调用这些回调:

var p = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('foo');
  }, 300);
});

p.then((result) => {
  console.log(result); // foo
}).catch((err) => {
  console.log(err);
});

为什么我们需要传递单独的回调?因为一个人会被决心所满足,而另一个人会被拒绝。然后resolve函数会调用callback,reject函数会调用catchcallback。

Javascript 引擎将在闲暇时执行这些回调,对于常规函数来说,这意味着事件循环被清除,对于超时来说,时间到了。

现在回答你的问题,我们如何从 Promise 中获取数据。好吧,我们不能。

如果你仔细观察,你会发现我们并没有真正取出数据,而是继续提供回调。没有取出数据,而是传入回调。

p.then((result) => {
  console.log(result);
}).catch((err) => {
  console.log(err);
});

有人说使用等待:

async function() {
  let result = await p;
}

但是有一个问题!我们必须将其包装在异步函数中。总是。为什么?因为 Async/await 是 Promise api 之上的另一个抽象或语法糖级别,无论您喜欢哪种。这就是为什么我们不能直接使用await而是总是将其包装在async语句中。

总而言之,当我们使用 Promise 或 async/await 时,我们需要遵循一定的约定并编写简洁的代码和紧密结合的回调。 javascript 引擎或像 babeljs 或 typescript 这样的转译器将这些代码转换为要运行的常规 javascript。

我可以理解您的困惑,因为人们在谈论承诺时一直说获取数据,但我们没有获取任何数据,而是传递回调以在数据准备好时执行。

希望现在一切都清楚了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在没有异步/等待的情况下从待解决的承诺中获取数据? 的相关文章

  • 为什么 AngularJS 在使用 ng-bind-html 时会去掉 data- 属性?

    我正在使用 contentEditable div 来使用户能够格式化他们的文章 我对html内容做了一些处理并保留它 我在用ng bind html当观众想要阅读文章时呈现结果 我不想使用 sce trustAsHtml因为我仍然希望 A
  • Promise.all 返回一个未定义的数组并在完成之前解析

    我在返回数组的函数时遇到问题undefined 这是代码 classMethods getQueries function models dbId dateStart dateEnd return new Promise function
  • ExtJs4 Json TreeStore?

    我正在将 ExtJs3 应用程序迁移到 ExtJs4 在 ExtJs3 中 我有一个树网格 它有一个加载器来加载树数据 如下所示 loader new Ext tree TreeLoader dataUrl Department Depar
  • 设置 JavaScript 对象的 length 属性

    假设我有一个 JavaScript 对象 function a var A this length function return A length this add function x A push x this remove func
  • 如何在 guildMemberAdd 中使用awaitReactions

    当用户连接到我的服务器时 我向他们发送消息 并且我想通过单击反应来继续授权 我怎样才能创建这个 我正在使用以下代码 robot on guildMemberAdd gMembAdd gt gMembAdd send Hi gMembAdd
  • 使用 JS 和 HTML 将当前 URL 插入链接

    所以 我已经阅读了类似的内容 但我仍然找不到更适合我正在做的事情的答案 我正在尝试使用 JS 获取当前页面 URL 并将其附加到社交媒体共享链接 如下所示 a href target blank 使用 Javascript 我成功地将当前
  • 当列表包含图像时,React Native FlatList 感觉很慢

    我为 avater 使用 64x64 图像 它的尺寸非常小 通过我的应用程序 滚动时帧率下降至 25 35 fps 如何优化 flatList 图像
  • JavaScript 函数参数和范围

    我用下面列出的代码做了一些测试 function foo x alert y var y I am defined outside foo definition foo 上面的代码给了我一个警告 我是在 foo 定义之外定义的 然后另一个测
  • 元素上的 jQuery touchSwipe 事件阻止滚动

    我有一些清单div元素垂直排序 使用jQuery TouchSwipe 插件 https github com mattbryson TouchSwipe Jquery Plugin添加了滑动事件来捕获左右滑动 想法是通过向左或向右滑动来从
  • Imperavi Redactor 内容未复制到隐藏文本区域

    我正在尝试使用因佩拉维编辑器 http imperavi com redactor 在这里控制我的富文本编辑 div class control group div class controls div div document ready
  • 是否可以从“GET”请求中检索 MS/延迟? (Javascript/Jquery)

    我目前正在使用 jquery 发出一些 getjson 请求 他们是获取请求 GET http localhost MySite JSON http localhost MySite JSON 现在您可以在 Firebug 中观看请求的触发
  • 与玻璃钢战斗

    我读过有关 FRP 的内容 非常兴奋 它看起来很棒 因此您可以编写更多高级代码 并且一切都更加可组合 等等 然后我尝试用数百个 sloc 从纯 js 到 Bacon 重写我自己的小游戏 我发现 我实际上不是编写高级纯逻辑代码 而是击败了 B
  • Node.JS Web 服务器中的安全性

    所以 我正在学习 Node JS 到目前为止我很喜欢它 我已经有几个项目在工作了 我想我可以在其中使用nodejs 不过 我担心安全问题 如果我使用 Node JS http 模块编写自定义 Web 服务器 我是否可能非常容易受到攻击 Ap
  • everyauth 承诺是什么?

    我不明白 everyauth 承诺是什么 我发现我需要返回一个 Promise 对象或用户 但是 everyauth Promise 是什么 当您有一个执行身份验证但异步执行的函数时 它非常有用 您不能直接从函数返回用户信息 因为您必须等待
  • 在没有全局变量的情况下对多个事件使用 Promise 回调

    我有一个包含在函数中的承诺 我将使用不同的输入参数多次调用该函数 每次承诺解决时 我都会将解决的值推送到存储数组中 当我所有的调用承诺都得到解决后 我将在其他函数中使用这个存储数组 是否有任何干净的方法可以在不使用 全局 变量的情况下进行设
  • Google Apps 脚本:如何水平对齐 inlineImage

    我有以下代码 它是一个更大程序的一部分 我正在尝试将图像从我的 Google 驱动器插入到 Google 文档中 并调整其大小并居中 到目前为止 我能够让程序插入图像并调整其大小 但我不知道如何使 inlineImage 居中 我是使用谷歌
  • 如何使用 jQuery AJAX 和 JSON 通过 Bootbox 确认表单提交

    我正在使用一个网络应用程序工作Spring MVC 我试图在提交表单之前显示一个确认对话框Bootbox 但我收到 500 内部服务器错误 这是我的表格
  • 如何在 Android 设备(平板电脑和手机)方向更改时获得正确的窗口宽度

    我正在尝试使用 jquery 函数计算 Android 设备方向变化时的窗口宽度 window outerWidth true 此计算给出了两个方向变化的正确宽度iphone and ipad但在安卓中不行 如果我最初以横向模式或纵向模式加
  • 如何使用 Browserify 获取 html 模板

    我正在尝试找出一种简单的方法 在脚本中需要 html 模板 然后从 CLI 运行 browserify 假设我想获取一个模板并将其附加到正文中 index js var template require template html docu
  • 如何通过 jQuery onblur 提交表单

    所以我尝试通过 jQuery onblur 提交表单 即一旦焦点离开密码字段 表单就会通过 jQuery 提交 有类似的问题 但这不是我要找的 我尝试使用 document getElementById 但它不起作用 任何帮助表示赞赏 提前

随机推荐