javascript - 初学者异步/等待问题
解决方案
您的代码的两个版本几乎是等效的。使用关键字声明的任何函数async
都会返回一个承诺。
举个例子,下面的函数,尽管看起来没有做任何与 Promise 相关的事情,但会返回一个 Promise:
async function helloWorld() {
return "Hello World";
}
我们可以通过以下方式验证这一点
> helloWorld().then(result => console.log(result));
Hello World
正如async
关键字所暗示的,我们正在指示 JavaScript 运行时它应该异步运行函数。由于函数的调用者在执行类似的操作时需要立即接收结果let result = helloWorld()
,因此result
包含一个 Promise,该 Promise 最终将解析为的返回值helloWorld()
(或者如果helloWorld()
抛出错误则被拒绝)。
result = await new Promise...
因此,在您的代码中,顶部版本 ( ) 和底部版本 ( )之间几乎没有区别result = new Promise...
:在这两种情况下,您的函数asyncData()
都将返回一个 Promise,该 Promise 最终会解析为请求数据,或者如果请求失败则拒绝。
有一点不同。在执行的代码的顶级版本中result = await new Promise...
,第 23 和 24 行将仅在第 6-22 行之后执行,因此您会在看到“返回承诺”之前看到“Rest call successful”。在底层代码中result = new Promise...
,第 23 行将立即执行,因此您将首先看到“Rest call successful”。
造成这种差异的原因是,一条await
语句类似于将每一行放在await
语句之后的then
块中。下面的例子说明了这一点。
async function returnsAPromise() {
return Promise.resolve("Hello World");
}
// this will log the result first.
async function withAwait() {
const result = await returnsAPromise();
console.log(result);
console.log("rest of function");
}
// this is equivalent to the function above, because of the way await works.
function withEquivalentThen() {
const result = returnsAPromise();
result.then(r => {
console.log(r);
console.log("rest of function");
});
}
// this version logs "rest of function" first.
function dontWaitForPromiseThen() {
const result = returnsAPromise();
result.then(r => console.log(r));
console.log("rest of function");
}
推荐阅读
- javascript - onclick 开始动画
- javascript - 如何根据使用脚本从上一个问题中选择的日期更新 Google 表单上的多项选择题
- groovy - Groovy - 将字符串转换为嵌套列表
- r - R中GAM模型中基因组变量的空间自相关
- python - 在使用 skimage 计算 2 个图像之间的度量之前应用掩码
- python - 尝试使用 Python 和 Chromedriver 从网站上抓取数据,但它返回“查找”的非类型错误
- angular - 使用 Visual Studio Code 将简单的 Angular 8 应用程序部署到 Azure
- ios - Apple 是否允许在模拟器上测试身份验证服务(Apple 登录)
- powerbi - 在 Power BI 中,如何根据使用 DAX 的度量返回的所有类别的最大值返回类别标签?
- r - 将变量分配给R中粘贴的列名称