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-同样重要的是,要理解您使用的承诺反模式的一个结果是ifasynchronousFunctionThatReturnsPromise()
拒绝它的承诺,您的代码将默默地忽略这种拒绝。调用方永远不会看到被拒绝的承诺,因为您围绕着返回spromise()
且正在返回的异步函数包装的承诺没有跟踪拒绝,这是一个严重的错误。这在我的例子中没有发生。这是使用反模式的主要问题之一(除了不必要的增加的复杂性)。啊,好吧,好吧,这很有道理。myFunction不应该返回除resolve(xyz)之外的任何内容,我无法访问调用myFunction的位置。“不,你应该修改myFunction以正确编写代码”-好,这就是我想知道的。@Ferenjito-您的示例返回了一个承诺。我的例子回报了一个承诺。它们对于调用者来说是相同的,只是我的示例在许多情况下都能正常工作,而您的示例却不能正常工作,并且我的示例避免了常见的承诺反模式。@Ferenjito-同样重要的是,要理解您使用的承诺反模式的一个结果是ifasynchronousFunctionThatReturnsPromise()
拒绝它的承诺,您的代码将默默地忽略这种拒绝。调用方永远不会看到被拒绝的承诺,因为您围绕着返回spromise()
且正在返回的异步函数包装的承诺没有跟踪拒绝,这是一个严重的错误。这在我的例子中没有发生。这是使用反模式的主要问题之一(除了不必要的额外复杂性)。