0

我需要对数组进行迭代,对于每个项目,我通过调用HTTP call.

困难在于我需要syncronize这个过程才能在循环之后调用回调(包含由 执行的所有操作之后的数组HTTP call)。

让我们考虑这个简短的例子:

 function customName(name, callback) {
   var option = {
        host:'changename.com',
        path: '/'+name,
        headers: { 'Content-Type': 'application/json'  },
        port: 80,
        method:'POST'
    };

    var req = http.request(option, function(res) {
        var output = "";
        res.on('data', function (chunk) {
            output += chunk;
        });

        res.on('end', function() {
            var obj = JSON.parse(output);
            callback(obj.res);
        });
    });

    req.on('error', function(e) {
        console.error(e.message);
    });

    req.end();
}

function changeNames(OldNames, callback) {
  var Res = [];
  for (name in OldNames) {
    customName(OldNames[name], function(new_name) { Res.push(new_name); });
  });
  callback(Res);
}

var Names = ['toto', 'tata', 'titi'];
changeNames(Names, function(Names) {
    //...
});

这里循环在第一个之前结束HTTP call,所以Res array是空的。

我们如何同步这个执行?

我知道在 nodejs 中同步处理并不是很好。您认为与客户一一沟通名称而不是构建数组会更好吗?

4

1 回答 1

2

你可以使用async.map它。您将名称列表传递给它,它会为每个名称运行getOriginalName函数(customName我认为您错误地称为 )并收集结果,最后它将调用具有结果数组的函数:

var http  = require('http');
var async = require('async');

function getOriginalName(name, callback) {
  var option = {
    host:'changename.com',
    path: '/'+name,
    headers: { 'Content-Type': 'application/json'  },
    port: 80,
    method:'POST'
  };

  var req = http.request(option, function(res) {
    var output = "";
    res.on('data', function (chunk) {
      output += chunk;
    });

    res.on('end', function() {
      var obj = JSON.parse(output);
      callback(null, obj.res);
    });
  });

  req.on('error', function(e) {
    callback(e);
  });

  req.end();
}

function changeNames(OldNames, callback) {
  async.map(OldNames, getOriginalName, callback);
}

var Names = ['toto', 'tata', 'titi'];
changeNames(Names, function(err, NewNames) {
  console.log('N', NewNames);
});
于 2013-05-11T07:40:44.570 回答