Q Promise Nodejs how to resolve in loop

余生颓废 提交于 2019-11-29 02:21:33
Benjamin Gruenbaum

Instead of a deferred.resolve() on an array which will resolve immediately, use Q.all which waits for an array of promises:

theFunction()
.then(function(data) {
    var result = [];
    for(var i=0; i < data.length; i++) (function(i){
        result.push(secondFunc(data[i].item)
        .then(function(data2) {
            data[i].more = data2.item;
            return data[i];
        }));
    })(i); // avoid the closure loop problem
    return Q.all(result)
});

Or even better:

theFunction()
.then(function(data) {
    return Q.all(data.map(function(item)
        return secondFunc(item)
        .then(function(data2) {
            item.more = data2.item;
            return item;
        });
    });
});

I know this is a older post but I've the same problem and did not found any solution. Maybe someone here find a good solution very fast.

function CompareTeamspeakClients(forumUsers) {
  var promises = [];
  var tsClient = new TeamSpeakClient("127.0.0.1", 10011);

  tsClient.send("login", {
    client_login_name: "serveradmin",
    client_login_password: "M+h8YzUA"
  }, function(err, response){
    if (err) deferred.reject(err);
  });

  tsClient.send("use", {
    port: 9987
  }, function(err, response){
    if (err) deferred.reject(err);
  });

  forumUsers.forEach(function(user, index){
    var deferred = Q.defer();

    tsClient.send("clientdbfind", ["uid"], {
      pattern: user.tsid
    }, function(err, response){
      if (err) deferred.reject(err);
      if (response) {
        tsClient.send("clientdbinfo", {
          cldbid: response.cldbid
        }, function(err, response){
          if (err) deferred.reject(err);

          forumUsers[index]['tsdbid'] = response.client_database_id;
          forumUsers[index]['tsnickname'] = response.client_nickname;
          forumUsers[index]['tslastconnected'] = response.client_lastconnected;

          deferred.resolve(forumUsers);
        });
      }
    });

    promises.push(deferred.promise);
  });

  console.log(promises);

  return Q.all(promises);
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!