async / await是否不打算用于全局同步?

时间:2018-06-21 16:03:41

标签: javascript asynchronous

我希望这段代码:

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的感觉:(

1 个答案:

答案 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
    }
})();