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で処理を同期するのはあまり良くないことを私は知っています。配列を構築するのではなく、名前を 1 つずつクライアントに伝えたほうがよいと思いますか?

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 に答える