异步函数执行顺序与常规函数执行顺序

时间:2018-08-29 12:37:15

标签: javascript

据我了解,异步函数将始终返回诺言,并且只能在异步函数内使用await。

对于我的问题,让我们看下面的代码示例:

async function test1(data){
//do something
await FuncReturnsPromise();
await FuncReturnsPromise2();
//do something
}

和完全相同的功能但不异步:

function test2(data){
//do something
FuncReturnsPromise();
FuncReturnsPromise2();
//do something
}

现在在第二个函数(常规函数)中,如果我要调用它,它将开始执行并在到达FuncReturnsPromise时出现。

它也将开始执行它,直到它返回诺言,并且它将继续(在这里我不等待诺言)到第二个调用,仅此而已。

FuncReturnsPromiseFuncReturnsPromise2都执行一些语句,而不是执行异步xhr请求并返回promise,每个功能中的第一条语句对我来说都是至关重要的,因此需要以同步顺序执行。

所以我的问题是我是否可以编写这样的异步函数:

async function test1(data,wait){
//do something
if(wait)await FuncReturnsPromise();
else FuncReturnsPromise();
if(wait) await FuncReturnsPromise2();
else FuncReturnsPromise2();
//do something
} 

如果我将像这样test1(somedata,false)来调用它,该函数将像常规函数一样执行吗?还是应该为两个用例都声明异步和常规函数?

2 个答案:

答案 0 :(得分:1)

由于它是一个异步函数,它仍将返回promise,但是返回的promise将不会跟踪FuncReturnsPromise();FuncReturnsPromise2();的分辨率。

答案 1 :(得分:1)

要保存甚至创建Promise,可以将您的wait函数包装在一个匿名函数中,并仅在使用wait标志时返回该函数,否则直接执行这些函数。

例如

function test1(data, wait){
  if (wait) {
    return (async function () {
      await FuncReturnsPromise();
      await FuncReturnsPromise2();
    }());
  } else {
    FuncReturnsPromise()
    FuncReturnsPromise2();
  }
}