以下情况:
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)的任何内容?
答案 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以正确编写代码。如果您在现实世界中有一些现实世界的约束,那么您就不得不发布一个包含这些实际细节和真实代码(不是伪代码)的问题,以便我们为您提供更具体的建议。