nodejs中的多级承诺

时间:2017-09-08 14:17:17

标签: javascript node.js promise

我有承诺问题

我希望使用promise获得所有类别和子类别(多级别类别)。但我不能得到多层次的承诺。我可以得到第一个Promise使用Promise.all(Array)但不能得到孩子的承诺。

    getChild: function(_cats){
   var arrCat=[];
   var that = this;
   for (var i = 0, len = _cats.length; i < len; i++) { 
    var t = new Promise(function(resolve,reject){
     var a = [];
     var _c = _cats[i];

     _cats[i].getChildren(function(err, _childs){

      a.push({
        root: _c,
        child:  that.getChild(_childs)
      });
     resolve(a);
   })
   })
    arrCat.push (t);
  }
  return Promise.all(arrCat);

和其他函数调用和响应api:

this.getChild(_cats).then(_r => {
  return res.ok(_r);  
})

和respone

[{
root: {value} // it's ok
child: promise(pending) //it's problem
}]

请帮帮我!谢谢!

2 个答案:

答案 0 :(得分:2)

首先提取cat.getChildren的已宣传版本以使代码清晰。然后映射所有类别,并为每个类别返回一个Promise,只有在通过递归调用getChild加载每个嵌套子项后才能解析。像这样的东西应该做的伎俩

&#13;
&#13;
function getChildren(cat) {
  new Promise(function(resolve) {
    cat.getChildren(function(_, children) {
      resolve(children)
    })
  })
}

getChild: function getChild(_cats) {
  return Promise.all(
    _cats.map(function(cat) {
      return getChildren(cat)
        .then(getChild) // load each child
        .then(function(children) {
          return {
            root: cat,
            children: children
          }
        })
    })
  )
}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

这段代码非常完美。感谢Yury

function getChildren(cat) {
  new Promise(function(resolve) {
    cat.getChildren(function(_, children) {
      resolve(children)
    })
  })
}

getChild: function getChild(_cats) {
  return Promise.all(
    _cats.map(function(cat) {
      return getChildren(cat)
        .then(getChild) // load each child
        .then(function(children) {
          return {
            root: cat,
            children: children
          }
        })
    })
  )
}