我希望这段代码:
function resolveAfter2Seconds() {
return new Promise(resolve =>
setTimeout(() => { resolve('resolved'); }, 2000) );
}
async function asyncCall() {
console.log('calling');
var result = await resolveAfter2Seconds();
console.log(result);
}
asyncCall();
asyncCall();
要产生此输出:
"calling"
"resolved"
"calling"
"resolved"
但是我得到了:
"calling"
"calling"
"resolved"
"resolved"
我必须这样做以使代码同步:
function resolveAfter2Seconds() {
return new Promise(resolve =>
setTimeout(() => { resolve('resolved'); }, 2000) );
}
async function asyncCall() {
console.log('calling');
var result = await resolveAfter2Seconds();
console.log(result);
}
const main = async () => {
await asyncCall();
await asyncCall();
};
main();
这意味着如果我在函数调用树的内部有一个await调用,我必须在函数链中一直进行async / await才能获得整个应用程序的同步行为?这对我来说似乎很繁重。请告诉我我错了。这肯定消除了我大部分关于async / await的感觉:(
答案 0 :(得分:5)
前两个asyncCalls
重叠的原因是您没有await
。因此,第一个启动超时,返回,然后调用第二个,第二个启动超时,然后返回。
async / await是否不打算用于全局同步?
是,不是。您只能在await
函数中使用async
(尽管有一个Stage 2 proposal会添加顶级await
),所以(无论如何,现在)您不能使用await
在全球范围内。但是没有理由您不能立即切换到async
之类的main
函数,甚至只是内联:
(async () => {
// Use await here...
})().catch(err => {
// Last-ditch error handling here
});
或
(async () => {
try {
// Use await here...
} catch (err) {
// Last-ditch error handling here
}
})();