在promise中等待异步功能

时间:2018-09-06 20:23:06

标签: javascript asynchronous ecmascript-6 async-await es6-promise

以下情况:

function myFunction() {

      return new Promise(function (resolve, reject) {

          doSomething();
          let myVariable = doSomethingElse();

          let otherVariable = doOtherThings(myVariable);              

          return resolve(otherVariable);
      });
}

现在,我希望myVariable不能通过函数调用进行初始化,而应在回调中,或者在异步函数返回的promise的.then中进行初始化。

function myFunction() {

      return new Promise(function (resolve, reject) {

          doSomething();
          let myVariable;

          asynchronousFunctionThatReturnsPromise().then(function(param) {
             myVariable = doSomethingElse(param);
          });

          let otherVariable = doOtherThings(myVariable);              

          return resolve(otherVariable);
      });
}

理想情况下,外部函数将等到为myVariable分配一个值,直到执行doOtherThings(myVariable),但我想这在javascript中是不可能的。

不幸的是,我不能简单地将以下所有代码放入“回调”函数中,因为外部函数的返回依赖于结果。

有没有一种方法可以处理此问题,理想情况下无需更改外部函数(myFunction)的任何内容?

1 个答案:

答案 0 :(得分:6)

完全摆脱Promise包装器。这是promise anti-pattern,用于将一个承诺包裹在另一个承诺中。取而代之的是,只需返回您已经拥有的那个并将逻辑放入.then()处理程序中即可:

function myFunction() {
        doSomething();

        return asynchronousFunctionThatReturnsPromise().then(function(param) {
           let myVariable = doSomethingElse(param);
           let otherVariable = doOtherThings(myVariable);              
           return otherVariable;
        });
    });
}

用法:

myFunction().then(val => {
   console.log(val);        // will be the value of otherVariable above
}).catch(err => {
   console.log(err);
});
  

不幸的是,我不能简单地将以下所有代码放入“回调”函数中,因为外部函数的返回依赖于结果。

目前尚不清楚这是什么意思。您必须更改外部函数才能正确编写myFunction()

  

有没有一种方法可以处理此问题,理想情况下无需更改外部函数(myFunction)的任何内容?

不。您应该修改myFunction以正确编写代码。如果您在现实世界中有一些现实世界的约束,那么您就不得不发布一个包含这些实际细节和真实代码(不是伪代码)的问题,以便我们为您提供更具体的建议。