【发布时间】:2017-09-04 06:46:26
【问题描述】:
我很难理解 async 和 await 是如何在幕后工作的。我知道我们有承诺,通过使用“then”函数可以使我们的代码成为非阻塞代码,我们可以在承诺解决后放置我们需要做的所有工作。以及我们想要并行执行的工作以保证我们只是在 then 函数之外编写它。因此代码变得非阻塞。但是我不明白 async await 是如何生成非阻塞代码的。
async function myAsyncFunction() {
try {
let data = await myAPICall('https://jsonplaceholder.typicode.com/posts/1');
// It will not run this line until it resolves await.
let result = 2 + 2;
return data;
}catch (ex){
return ex;
}
}
参见上面的代码。在解决 API 调用之前,我无法继续前进。如果它使我的代码阻塞代码,那么它怎么比承诺更好?或者我对async 和await 有什么遗漏吗?我将不依赖于等待调用的代码放在哪里?所以它可以继续工作而无需等待执行?
我正在添加一个我想在异步等待示例中复制的 Promise 代码。
function myPromiseAPI() {
myAPICall('https://jsonplaceholder.typicode.com/posts/1')
.then(function (data) {
// data
});
// runs parallel
let result = 2 + 2;
}
【问题讨论】:
-
AFAIK,await 要求它等待的东西是一个承诺。所以这并不是真正的非此即彼。
-
这有点像“直到它解决”评论之后的行在
.then()中。而且你的整个函数本身就是异步的,所以无论调用什么它都不必等待它。 -
@Paul 如果不是 Promise,它还会转换 Promise 中的表达式。那是我在博客中读到的
-
@nnnnnn 是的。就像我把它放在.then()中一样。但是我如何将它放在异步等待场景中的 then() 之外
-
@RohailNajam 是的,不过,我的意思是关于异步调用。使用期望回调代替该承诺的函数是行不通的。
标签: javascript async-await es6-promise ecmascript-2017