嵌套承诺链处理? (Promise.then(新承诺))?

时间:2017-05-23 07:29:46

标签: javascript node.js sequelize.js bluebird es6-promise

我如何处理承诺中的承诺?

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编码..我在这里是新手)

0 个答案:

没有答案