我有一个异步函数,在函数体的中间我有两个等待,最后是一些逻辑和一个返回。这是如何执行的? AsyncCall1在AsyncCall2启动之前完成还是并行启动?在两者都有结果之前,过渡期会发生什么?
伪javascript代码类似于我正在做的事情:
const myFunction = async () => {
// some variable declarations
await AsyncCall1
await AsyncCall2
// some logic
return someData;
}
答案 0 :(得分:2)
await AsyncCall1;
console.log("one");
await AsyncCall2;
console.log("two");
等于:
AsyncCall1.then(function(){
console.log("one");
AsyncCall2.then(function(){
console.log("two");
});
});
这是如何执行的?
一个人实在无法说出来。这取决于承诺何时得到解决。但是一个总是会在两个之前记录。
AsyncCall1在AsyncCall2启动之前完成还是并行启动?
不可能说因为你没有开始有前途的功能,你只是在等待结果。如果你愿意的话:
await asyncFunc1();
await asyncFunc2();
然后只在第一个函数解析后调用(/ start) asyncFunc2 。但是如果你这样做:
const promise1 = asyncFunc(), promise2 = asyncFunc();
await promise1;
await promise2;
然后两个promises几乎同时启动,然后代码将在等待两者之后继续执行。请注意,您应在此处添加适当的错误处理,例如等待之前的catch
错误(在here上阅读):
const promise1 = asyncFunc().catch(e => null);
const promise2 = asyncFunc().catch(e => null);
在他们都有结果之前,过渡期会发生什么?
js引擎执行其他操作。当两者都完成后,它会跳回到等待结果的位置。
答案 1 :(得分:0)
在他们都有结果之前,过渡期会发生什么?
这些功能旁边的逻辑将被阻止,直到他们完成工作。
这是如何执行的? AsyncCall1在AsyncCall2启动之前完成还是并行启动?
AsyncCall1
之前结束,它们不会并行执行。
无论函数AsyncCall1
采用的时间如何,在AsyncCall2
结束工作之前,函数AsyncCall1
都不会执行。
function AsyncCall1() {
return new Promise(function(resolve) {
setTimeout(function() {
resolve("AsyncCall1");
}, 2000);
});
}
function AsyncCall2() {
return new Promise(function(resolve) {
setTimeout(function() {
resolve("AsyncCall2");
}, 5);
});
}
const myFunction = async () => {
let result = await AsyncCall1();
console.log(result);
let result2 = await AsyncCall2();
console.log(result2);
return someData;
}
console.log("Waiting 2 secs...")
myFunction();
await
阻止执行,即使函数AsyncCall1
没有返回Promise:
await
表达式导致异步函数执行暂停,直到Promise完成,解析或拒绝,并在执行完成后继续执行async函数。恢复时,await表达式的值是已履行的Promise的值。如果Promise被拒绝,则await表达式抛出被拒绝的值。
如果await运算符后面的表达式的值不是Promise,则将其转换为已解析的Promise 。
function AsyncCall1() {
return 5;
}
function AsyncCall2() {
return new Promise(function(resolve) {
setTimeout(function() {
resolve("AsyncCall2");
}, 5);
});
}
const myFunction = async () => {
let result = await AsyncCall1();
console.log(result);
let result2 = await AsyncCall2();
console.log(result2);
return someData;
}
myFunction();