我如何处理承诺中的承诺?
sql代表Sequelize。
asyncFunc1 //(sql.findOne)
.then(
(res1)=>asyncFunc2(res1) //(sql.findOrCreate - must end with spread)
.spread(
(res2)=>{ // **Must** Use asyncFunc2's Result value.
var newAsyncFunc1 = Promise.resolve(res2);
var newAsyncFunc2 = Promise.resolve(res2);
Promise.all([newAsyncFunc1,newAsyncFunc2])
}
.then(() => asyncFunc3(res1,res2)) //(sql.findOrCreate)
)) // **Must** Use asyncFunc1, 2's Result value.
.spread((res3) => asyncFunc4(res3);
--------------------------(已添加17.05.24)--------------- -------------
有关详细说明,
外部变量是parentId, childName, distance
,
User.findOne({where:{id:parentId}})
.then( //default is for creating rows
(res1)=>User.findOrCreate({where:{name:childName},default:{depth:res1.get('depth')+1}})
.spread(
(res2)=>{ //Create Msg Send to Users.
var msgHeader = Promise.resolve(res2); //also Async like findOne.
var msgBody = Promise.resolve(res2); //also Async like findOne.
Promise.all([msgHeader,msgBody]).then((resMsg)=>{
var message = {header:resMsg[0],body:resMsg[1]};
messageTxQueue.append[message];
}
}
.then(() => Family.findOrCreate(res1,res2))
))
.spread((res3) => Family.update({where:{id:res3},default:{distance:distance});
findOrCreate Document。 (http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-findOrCreate)(使用了Bluebird .spread
- ES6与.then
没有太大的差异)
http://bluebirdjs.com/docs/api/spread.html
--------------------------(已添加17.05.24)--------------- -------------
为什么我在.then(() => asyncFunc3(res1,res2))
下嵌套(res2)=>{}
是为了将res2
值传递给下一个函数。
我想要实现的是,我真的想在.then(() => asyncFunc3(res1,res2))
之后立即运行return Promise.all(newAsyncFunc)
。
所以运行顺序就像
asyncFunc -> asyncFunc2 -> Promise.all(newAsyncFunc) -> .then(asyncFunc3) -> asyncFunc4
但是这段代码就像这样。 asyncFunc -> asyncFunc2 -> asyncFunc3 -> asyncFunc4 ........(far after)-> Promise.all(newAsyncFunc)
我的代码有什么问题? 为什么这段代码不像我想要的那样链接?
(抱歉我的js编码..我在这里是新手)