async.waterfall 方法中未定义的回调

callback undefined in async.waterfall method

从下面的代码我没有得到 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
});

对于 eachSeries 签名看起来像这样 - callback(err),没有第二个参数,这就是为什么 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);
  }
});