async.waterfall方法

时间:2015-10-17 08:21:41

标签: javascript node.js async.js

从下面的代码我没有得到result1数据。这是未定义的。有人能帮助我吗?

async.waterfall([
    function(callback) {
        request({
            method: 'GET',
            headers: {
                'Content-Type': 'application/json'
            },
            url: url
        }, function(error, response, body) {
            if (error) {
                callback(error);
            } else {
                var result = JSON.parse(body);
                callback(null, result); //sending to next function
            }
        });
    },
    function(result, callback) {

        async.eachSeries(result, function(item, callback) {
            request({
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json'
                },
                url: url+item.id
            }, function(error, response, body) {
                if (error) {
                    callback(error);
                } else {
                    var result1 = JSON.parse(body);
                    callback(null, result1);
                }
            });
        }, function(err, result1) {
            if (!err) {
                callback(null, result1);
            } else {
                callback(err);
            }
        });
    },
    function(result1, callback) {
      console.log(result1);  // getting undefined
        request({
            method: 'GET',
            headers: {
                'Content-Type': 'application/json'
            },
            url: url
        }, function(error, response, body) {
            if (error) {
                callback(error);
            } else {
                var result2 = JSON.parse(body);
                callback(null, result2);
            }
        });
    }
], function(error, res) {
    console.log(res); // process final result
});

1 个答案:

答案 0 :(得分:2)

对于eachSeries签名看起来像这样 - 回调(错​​误),没有第二个参数,这就是为什么result1undefined

如果您需要在循环结束时获得结果,则需要使用.mapSeries,如此

async.mapSeries(result, function(item, callback) {
  request({
    method: 'GET',
    headers: {
      'Content-Type': 'application/json'
    },
    url: url + item.id
  }, function(error, response, body) {
    if (error) {
      callback(error);
    } else {
      var result1 = JSON.parse(body);
      callback(null, result1);
    }
  });
}, function(err, result1) {
  if (!err) {
    callback(null, result1);
  } else {
    callback(err);
  }
});