如果我的函数中有一个简单的条件(在下面的示例中),doFinalCheck()
总是最后执行吗?如果doThis()
或doThat()
是API请求,并且需要花费一些时间才能完成,doFinalCheck()
是否会在API请求之前执行?
checkSomething(array){
if (array){
doThis();
}
else {
doThat();
}
doFinalCheck();
}
答案 0 :(得分:2)
...
doFinalCheck()
总是要最后执行吗?
是的,除非doThis()
/ doThat()
引发异常。但是请继续阅读。
如果
doThis()
或doThat()
是API请求,并且需要一些时间才能完成,doFinalCheck()
是否会在API请求之前执行?
这取决于doThis()
和/或doThat()
是同步还是异步。
如果它们是同步的,是的,onFinalCheck()
将等待完成。
如果它们是异步,则onFinalCheck()
将等待直到完成doThis()
/ doThat()
调用,但该调用只是开始强>的过程。然后,该过程继续并异步完成。因此onFinalCheck()
将在该过程完成之前被调用。
如果要处理异步操作,请查看promises和新的(ES2018)async
functions。
例如,如果 doThis()
/ doThat()
是异步的,而如果它们返回承诺,那么您可以做出onFinalCheck()
等待操作完成,如下所示:
// I assume this is in an object initializer or `class`
async checkSomething(array){
// ^^^^^
if (array){
await doThis();
// ^^^^^
}
else {
await doThat();
// ^^^^^
}
doFinalCheck();
}
与所有async
函数一样,checkSomething
将返回诺言。
或者如果由于某些原因您不能使用async
函数,但是可以使用promise和doThis()
/ doThat()
返回诺言,则:
// I assume this is in an object initializer or `class`
checkSomething(array){
return (array ? doThis() : doThat())
.then(result => {
doFinalCheck();
return result;
});
}
请注意,checkSomething
返回上面的承诺。如果没有任何东西可以使用该承诺,则不要返回并内联错误检查:
// I assume this is in an object initializer or `class`
checkSomething(array){
return (array ? doThis() : doThat())
.then(result => {
doFinalCheck();
})
.catch(error => {
// ...handle/report the error...
});
}
答案 1 :(得分:0)
如果doThis()
和doThat()
是异步的(例如网络请求),则doFinalCheck()
将在网络请求发起之后但实际上尚未完成之前立即执行。
如果它们是异步的,则需要它们返回Promise
(或具有回调)。您还可以使用await
和async
语法(这只是Promise
上的语法糖。