我需要在promise链中间放入一个userID
param(这是唯一需要它的承诺)。所有承诺都应该以同步顺序执行。
SideNote- stackoverflow上的所有类似示例都有点不同 - 比如使用lambda函数(我使用声明的函数)。所以我还是不太确定。
var initialize = function(userID) {
var firstPromise = Module2.getFirstPromise();
firstPromise.then(getSecondPromise)
.then(getThirdPromise)
.then(getFourthPromise) //<----Fourth promise needs userID
.then(getFifthPromise)
.then(Utils.initializeComplete);
}
所有承诺都是这样的功能:
var thirdPromise = function() {
return new Promise(function(resolve, reject) {
//fetch data
//On Return, Store it
resolve() //Nothing needed to passed down from this promise
});
});
}
我正在尝试这个,并且它已经工作了#34;但是我不确定这是不是我的样式&#34;假设&#34;处理这样的事情。 :)
var initialize = function(userID) {
var firstPromise = Module2.getFirstPromise();
firstPromise.then(getSecondPromise)
.then(getThirdPromise)
.then(function(){ return fourthPromise(userID)})
.then(getFourthPromise)
.then(Utils.initializeComplete);
}
注意:getFirstPromise
来自我的代码中的其他模块。尽管如此,这不应该对这个问题很重要:)
答案 0 :(得分:5)
假设firstPromise
实际上是一个承诺,但是secondPromise
等等实际上是返回承诺的函数,那么是的,你所做的就是你应该怎么做要做到这一点。 Here's a live example on Babel's REPL,如下所示:
function doSomething(userID) {
getFirstPromise()
.then(getSecondPromise)
.then(getThirdPromise)
.then(() => getFourthPromise(userID))
// Or .then(function() { return getFourthPromise(userID); })
.then(getFifthPromise)
.catch(err => {
console.log("Error: " + err.message);
});
}
doSomething("foo");
function getFirstPromise() {
console.log("getFirstPromise called");
return new Promise(resolve => {
setTimeout(() => {
resolve("one");
}, 0);
});
}
// and then second, third, fourth (with user ID), and fifth
(如果您不使用箭头功能,只需将其替换为function
表格。)
请注意上面示例中的catch
。除非你有非常好的理由不,否则如果你没有.catch
结果,则承诺链应始终为return
。
答案 1 :(得分:4)
你的解决方案非常好。使用具体的签名可能更容易理解。
如果您的thirdPromise
没有采取任何行动并且不返回任何内容,则可能会写入其签名(伪代码假定a -> b
是a到b的函数)_ -> Promise (_)
。如果它返回某个值a
,则为_ -> Promise (a)
。如果它花了一些东西并返回了一些东西,它可能是a -> Promise (b)
因此,你可以推断你的承诺链,就像获取一些价值的函数一样,并返回包含在promise中的其他值。但是,您的fourthPromise
看起来有所不同:
fourthPromise : UserId -> a -> Promise (b)
可以写成:
fourthPromise : UserId -> (a -> Promise (b))
在成为您可以链接的实际承诺之前需要一个参数。在某种程度上,它是一个承诺的模板。
答案 2 :(得分:0)
如果你想在main函数中使用普通#category3
链,请尝试将getFourthPromise编写为工厂函数
.then
然后您将获得function getSomethingByUserID(userId) {
return function() {
return new Promise(function(resolve) {
//your actual async job
resolve('a result');
});
};
}
s
then
不要忘记,如果您错过向 var firstPromise = Module2.getFirstPromise()
.then(getSecondPromise)
.then(getSomethingByUserID(userId))
.then(Utils.initializeComplete);
提供userId
,则无效。