执行如何与2等待顺序

时间:2018-03-14 16:35:15

标签: javascript async-await

我有一个异步函数,在函数体的中间我有两个等待,最后是一些逻辑和一个返回。这是如何执行的? AsyncCall1在AsyncCall2启动之前完成还是并行启动?在两者都有结果之前,过渡期会发生什么?

伪javascript代码类似于我正在做的事情:

const myFunction = async () => {
  // some variable declarations

  await AsyncCall1
  await AsyncCall2

  // some logic 

  return someData;

}

2 个答案:

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