所以,我有一个像这样的承诺链的函数:
Myclass.Prototype.initAsync = function() {
someFunctionAsync(params).bind(this)
.then(function(data) {
processData(data);
return someOtherFunctionAsync(params).bind(this);
})
.then(function(data) {
processData(data);
return yetAnotherFunctionAsync(params).bind(this);
})
.finally(function(data) {
processData(data);
});
}
它有效,但我希望这个功能本身能够成为一系列承诺。通常,我只是摆脱了#34;最后"最后,但我不希望调用者负责调用processData。我希望能够像这样调用这个函数:
setupFunctionAsync(params).bind(this)
.then(function(data) {
processSetup();
return initAsync();
})
.finally(function(data) {
runProgram();
});
在"最后" initAsync,做什么是正确的?我想用Promise.new创建一个新的空承诺并返回吗?或者我想使用一个空方法使用Promise.method?或者有更好的方法吗?
现在我正在做以下事情,但我想知道这是否是最好的事情:
return someFunctionAsync(params).bind(this)
.then(function(data) {
...
.then(function(data) {
processData(data);
return new Promise(function(resolve, reject) { resolve(); });
});
最新更新:
阅读完一些答案后,这会有效吗?
Myclass.Prototype.initAsync = function() {
return someFunctionAsync(params).bind(this)
.then(function(data) {
processData(data);
return someOtherFunctionAsync(params).bind(this);
})
.then(function(data) {
processData(data);
return yetAnotherFunctionAsync(params).bind(this);
})
.then(function(data) {
processData(data);
});
}
,它被称为:
this.initAsync()
.then(function() {
runProgram();
});
请注意,我没有"返回"在initAsync的最后一个。那可以吗?
答案 0 :(得分:3)
我认为你误解了finally
。在任何情况下都会调用传递给finally
的函数,这意味着在解析promise和拒绝promise时。 finally
还返回另一个promise(具有前一个promise的值),因此链接没问题。
看起来很像你应该使用then
并且你只使用finally
因为它似乎非常适合这个过程的最后一步。你可以在这里使用then
。
无论如何,由于finally
已经返回一个承诺,您只需在函数开头添加return
即可。你不需要一个假的承诺"。
在最后then
传递的函数中没有返回语句不是问题。它只是意味着没有值传递给then
之后链接的下一个承诺。但是,无论如何它都会被调用。您添加到问题中的代码看起来很好。