Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在承诺范围内等待异步函数_Javascript_Asynchronous_Ecmascript 6_Async Await_Es6 Promise - Fatal编程技术网

Javascript 在承诺范围内等待异步函数

Javascript 在承诺范围内等待异步函数,javascript,asynchronous,ecmascript-6,async-await,es6-promise,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 res

以下情况:

function myFunction() {

      return new Promise(function (resolve, reject) {

          doSomething();
          let myVariable = doSomethingElse();

          let otherVariable = doOtherThings(myVariable);              

          return resolve(otherVariable);
      });
}
现在,我希望myVariable不是通过函数调用初始化的,而是在回调中,或者更确切地说,在异步函数返回的承诺的

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中是不可能的

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


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

完全摆脱promise包装器。这是一个用一个承诺来包装另一个承诺的过程。相反,只需返回您已有的,并将您的逻辑放入
。然后()
处理程序:

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);
});
不幸的是,我不能简单地将以下所有代码放在“callback”函数中,因为外部函数的返回依赖于结果

不清楚这意味着什么。您必须更改外部函数才能正确写入
myFunction()

有没有一种方法可以处理这个问题,理想情况下不必更改外部函数(myFunction)的任何内容


不可以。您应该修改myFunction以正确编写代码。如果你有一些现实世界的情况和一些现实世界的限制,那么你必须发布一个不同的问题,这些实际的细节和真实的代码(不是伪代码)让我们更具体地建议你。

完全摆脱承诺包装器。这是一个用一个承诺来包装另一个承诺的过程。相反,只需返回您已有的,并将您的逻辑放入
。然后()
处理程序:

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);
});
不幸的是,我不能简单地将以下所有代码放在“callback”函数中,因为外部函数的返回依赖于结果

不清楚这意味着什么。您必须更改外部函数才能正确写入
myFunction()

有没有一种方法可以处理这个问题,理想情况下不必更改外部函数(myFunction)的任何内容


不可以。您应该修改myFunction以正确编写代码。如果你有一些现实世界中的情况和一些现实世界中的约束,那么你必须发布一个不同的问题,其中包含这些实际的细节和真实的代码(不是伪代码),以便我们更具体地建议你。

将依赖于
myVariable
的代码放入
回调中。然后()。这包括
resolve()
调用。你的
myFunction()
调用已经返回了一个Promise实例,因此任何调用它的东西都必须使用自己的
。然后()
回调。哦,你不必
resolve()
返回值。它不会伤害任何东西,但也不会做任何有用的事情。请将依赖于
myVariable
的代码放入
中。然后()
回调。这包括
resolve()
调用。你的
myFunction()
调用已经返回了一个Promise实例,因此任何调用它的东西都必须使用自己的
。然后()
回调。哦,你不必
resolve()
返回值。它不会伤害任何东西,但也不会做任何有用的事情。啊,好吧,好吧,这很有道理。我的函数不应该返回除resolve(xyz)以外的任何东西,我无权访问调用myFunction的位置。“不,你应该修改myFunction以正确编写代码”-好,这就是我想知道的。@Ferenjito-您的示例返回了一个承诺。我的例子回报了一个承诺。它们对于调用者来说是相同的,只是我的示例在许多情况下都能正常工作,而您的示例却不能正常工作,并且我的示例避免了常见的承诺反模式。@Ferenjito-同样重要的是,要理解您使用的承诺反模式的一个结果是if
asynchronousFunctionThatReturnsPromise()
拒绝它的承诺,您的代码将默默地忽略这种拒绝。调用方永远不会看到被拒绝的承诺,因为您围绕着返回spromise()
且正在返回的
异步函数包装的承诺没有跟踪拒绝,这是一个严重的错误。这在我的例子中没有发生。这是使用反模式的主要问题之一(除了不必要的增加的复杂性)。啊,好吧,好吧,这很有道理。myFunction不应该返回除resolve(xyz)之外的任何内容,我无法访问调用myFunction的位置。“不,你应该修改myFunction以正确编写代码”-好,这就是我想知道的。@Ferenjito-您的示例返回了一个承诺。我的例子回报了一个承诺。它们对于调用者来说是相同的,只是我的示例在许多情况下都能正常工作,而您的示例却不能正常工作,并且我的示例避免了常见的承诺反模式。@Ferenjito-同样重要的是,要理解您使用的承诺反模式的一个结果是if
asynchronousFunctionThatReturnsPromise()
拒绝它的承诺,您的代码将默默地忽略这种拒绝。调用方永远不会看到被拒绝的承诺,因为您围绕着返回spromise()
且正在返回的
异步函数包装的承诺没有跟踪拒绝,这是一个严重的错误。这在我的例子中没有发生。这是使用反模式的主要问题之一(除了不必要的额外复杂性)。