Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Q Promise NodeJ如何解决循环中的问题_Node.js_Loops_Promise_Q - Fatal编程技术网

Node.js Q Promise NodeJ如何解决循环中的问题

Node.js Q Promise NodeJ如何解决循环中的问题,node.js,loops,promise,q,Node.js,Loops,Promise,Q,我有用nodejs编写的代码,使用Q承诺让我感到困惑 theFunction() .then(function(data) { var deferred = Q.defer() var result = []; for(i=0; i < data.length; i++) { secondFunc(data.item) .then(function(data2) { data.more = data2.ite

我有用nodejs编写的代码,使用
Q承诺让我感到困惑

theFunction()
.then(function(data) {
    var deferred = Q.defer()
    var result = [];
    for(i=0; i < data.length; i++) {

        secondFunc(data.item)
        .then(function(data2) {
            data.more = data2.item
        });
        result.push(data);

    }

    deferred.resolve(result);
    deferred.promise();

});
就这样

[
    {
        id: 1,
        item: 1,
        hero: 2
    },
    {
        id: 1,
        item: 1,
        hero: 2
    }
]
[
    {
        id: 1,
        item: 1,
        hero: 2,
        more: {
            list: 1
        }
    },
    {
        id: 1,
        item: 1,
        hero: 2,
        more: {
            list: 4
        }

    }
]
我尝试了几种方法,首先输入命令 deferred.resolve();语句,仅显示1个数据
有什么解决方案吗?

而不是延迟的
解决方法()
在将立即解决的数组上,使用等待承诺数组的
Q.all

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)
});

我知道这是一个老帖子,但我有同样的问题,并没有找到任何解决办法。也许这里有人能很快找到一个好的解决方案

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);
}

THNAK的第二个代码工作正常,在
结果上几乎没有错误。map
应该是
数据。map
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);
}