繁体   English   中英

节点承诺循环等待结果

[英]node promise for loop wait for result

如何等待for循环进入下一个循环?

在传递新变量之前,如何确保执行userdetails并将realresult.playername分配给新变量?

码:

return new Promise( function (resolve, reject) {

    arr = [];


    messages.find({convid: convid}).then(function(result) {

        for(var a in result) {
            realresult = result[a];

            userData.userDetails(realresult.userid).then(function (result) {
                realresult.playername = result.username;
            });
            userData.usercashinfo(realresult.userid).then(function (resulttwo) {
                realresult.playerdetails = resulttwo;
            });

            arr.push(realresult);

        }

        return resolve(arr);
    });
});

您正在尝试编写一个承诺,该承诺在解析时将返回已解析的承诺值数组。 您应该在这里做两件事:

  1. 使用return来等待诺言的完成。 在promise链中,除非将promise值return否则什么都无法解决。 (您还应该将其用于message.find()因为它也可以给您带来希望。)
  2. 将数组构造为一个Promise数组,而不是迭代并在它们解决时让Promise推入数组。
  3. 使用Promise.all()收集的承诺对象- all()返回只毕竟传递给它的承诺已经解决。
  4. (可选)不要重复使用result变量名称来表示多种含义。 这里没有错,但是会引起不必要的混乱。

放在一起,这看起来像:

return messages.find(...).then(function(result) {
  var promiseArr = [];
  for (var a in result) {
    promiseArr.push(
      promise.all([userData.userDetails(...), userData.usercashinfo(...)])
      .then(function(detailinfo) {
        var realresult = result[a];
        var details = detailinfo[0];
        var cashinfo = detailinfo[1];
        realresult.playername = details.username;
        realresult.playerdetails = cashinfo;
        return realresult;
    });
  }
  return Promise.all(promiseArr);
});

因此,我认为尝试通过生成器和Promise的组合来解决它是一个好主意,我不确定这是最好的方法,但是将两者结合起来是一个好习惯,所以我尝试了一下。

这个想法是生成器函数在开始新的迭代之前正在等待回调函数,并且回调函数在告诉生成器函数继续进行迭代之前正在等待两个承诺完成。

这是我首先在Codepen上尝试过的更简单的示例

return new Promise( function (resolve, reject) {
    arr = [];
    messages.find({convid: convid}).then(function(result) {
        function* iterations() {
            for (var i = 0; i < result.length; i++) {
                realresult = result[i];
                try {
                    var cbResult = yield cb(result[i].userid);
                    realresult.playername = cbResult.playername;
                    realresult.playerdetails = cbResult.playerdetails;
                    arr.push(realresult);
                } catch (e) { reject(e) }
            }
            return arr.value;
        }

        var it = iterations();
        it.next();

        function cb(userid) {
            Promise.all([
                       userData.userDetails(userid),
                       userData.usercashinfo(userid)
                       ]).then(
                           function(values) {
                               var realresult = {playername : values[0], playerdetails : values[1]}
                               returnValue = it.next(realresult);
                               if (returnValue.done) {
                                   resolve(returnValue);
                               }
                           },
                           function(e) { reject(e) }
                       );
        }
    });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM