Javascript条件执行流程

时间:2018-07-16 16:14:10

标签: javascript

如果我的函数中有一个简单的条件(在下面的示例中),doFinalCheck()总是最后执行吗?如果doThis()doThat()是API请求,并且需要花费一些时间才能完成,doFinalCheck()是否会在API请求之前执行?

checkSomething(array){
  if (array){
    doThis();
  }
  else {
    doThat();
  }
  doFinalCheck();
}  

2 个答案:

答案 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(或具有回调)。您还可以使用awaitasync语法(这只是Promise上的语法糖。