据我了解,异步函数将始终返回诺言,并且只能在异步函数内使用await。
对于我的问题,让我们看下面的代码示例:
async function test1(data){
//do something
await FuncReturnsPromise();
await FuncReturnsPromise2();
//do something
}
和完全相同的功能但不异步:
function test2(data){
//do something
FuncReturnsPromise();
FuncReturnsPromise2();
//do something
}
现在在第二个函数(常规函数)中,如果我要调用它,它将开始执行并在到达FuncReturnsPromise
时出现。
它也将开始执行它,直到它返回诺言,并且它将继续(在这里我不等待诺言)到第二个调用,仅此而已。
FuncReturnsPromise
和FuncReturnsPromise2
都执行一些语句,而不是执行异步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)
来调用它,该函数将像常规函数一样执行吗?还是应该为两个用例都声明异步和常规函数?
答案 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();
}
}