我有一个令人困惑的问题:
我正在使用promise chain来调用几个函数,如下所示:
CommonPromiseLists.checkStatusPromise().then(CommonPromiseLists.getChannelPreferencePromise).then(CommonPromiseLists.getChannelsPromise).then(getUniqueStory.bind(null, storyId))
如您所见,函数被调用,我得到了正确的结果。但是,根据最近的需求更改,我需要将CommonPromiseLists.checkStatusPromise()的返回值传递给getUniqueStory.bind(null,storyId),这是我调用的最后一个promise。我有一个解决方案:所以每当我返回并将返回的值交给下一个promise时,我也可以包含第一个promise的返回值。但我相信应该有一个更简单的方法。有没有更好的方法我可以获取checkStatusPromise()的返回值并将其传递给getUniqueStory.bind(null,storyId,第一个promise的返回值)?
答案 0 :(得分:2)
你可以通过promise链传递结果,但这会使代码紧密耦合,要求后续的回调预测一个奇怪的结构作为已解析的值。
使用普通承诺,更简单的方法是将其余操作包含在checkStatusPromise
回调中。这样,checkStatusPromise
的结果就会曝光。
CommonPromiseLists.checkStatusPromise().then(res => {
return CommonPromiseLists.getChannelPreferencePromise(res)
.then(CommonPromiseLists.getChannelsPromise)
.then(getUniqueStory.bind(null, storyId, res)) // access res
});
如果你可以使用async-await,它就会变得容易一些:
async enclosingFunction(){
const status = await CommonPromiseLists.checkStatusPromise();
const channelPreference = await CommonPromiseLists.getChannelPreferencePromise(status);
const channels = await CommonPromiseLists.getChannelsPromise(channelPreference);
const uniqueStory = await getUniqueStory.bind(null, storyId, res)
return uniqueStory;
}
enclosingFunction().then(value => /* results */)
答案 1 :(得分:1)
承诺可能不是你需要在这里使用的。看起来你需要一个生成器或async / await。我会在这里使用async / await,因为它可能更容易理解。
想象一下,你有一个返回这样的承诺的函数
function double(someVal) {
return new Promise(resolve => {
setTimeout(() => {
resolve(someVal * 2);
}, 2000);
});
}
您可以像这样使用async / await
async function sumMultiplications() {
var a = await double(5);
var b = await double(20);
var c = await double(a);
return a + b + c;
}
当调用异步函数时,它返回一个Promise。当异步时 函数返回一个值,Promise将被解析 返回值。当异步函数抛出异常或某些异常时 价值,承诺将以抛出的价值被拒绝。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
答案 2 :(得分:0)
如果您需要,只需保存结果:
let res;
func1().then(result=>{
res = result;
return func2();
})
.then(func3)
.then(func4)
...
then(result=>{
...
return res; //return result that you save as result of the first promise
})
.catch(err=>{
throw err;
})
如果你想省略一些步骤,你可以这样做:
let res;
func1().then(result=>{
res = result;
if(res) //you check of the result
return func2().then(func3);
else
return func4();
})
then(result=>{
...
return res; //return result that you save as result of the first promise
})
.catch(err=>{
throw err;
})