多个异步请求

Posted

技术标签:

【中文标题】多个异步请求【英文标题】:Multiple async request 【发布时间】:2015-01-17 10:05:03 【问题描述】:

好吧,我在这里尝试在对象列表中进行一些验证,但是函数验证调用了三个异步方法(它们向数据库发出请求)。但是当我并行调用 then 时,应用程序给出了错误 500。

_.each(titlesToSave, function(title, index) 
    titleValidator.validateAsync(title, function (err) 
        if (err) 
            invalidTitles.push(index: index, error: err);
        
        joinArray[index](); 
     ); 
);

var validateAsync = function (title, next) 
    async.parallel([
        function(callback) checkCity(title.carrier.address, callback),
        function(callback) checkCity(title.beneficiary.address, callback),
        function(callback) checkCity(title.seller.address, callback)
    ],
        function (err,results) 
            if(err)
                console.log('ERROR: ' +err);
                next(err);
            else
                console.log('Result: '+results);
                next();
            
        );
;

var checkCity = function(adress, callback)
    var url = 'http://localhost:9000/api/city/'+adress.state+'/'+adress.city;
    if (adress) 
        http.get(url, function (res) 
            console.log('STATUS: ' + res.statusCode);
            res.on('data', function (chunk) 
                if (res.statusCode === 200) 
                    console.log(''+chunk);
                    callback(null, chunk);
                 else 
                    console.log('Invalid city: '+adress.city+', StatusCode: ' + res.statusCode);
                    callback(new Error('Invalid adress.'));
                
            );
        ).on('error', function (error) 
            callback(error);
        );
    
;

【问题讨论】:

服务器错误日志中有什么内容? 你真的不应该在你的data事件处理程序中做你的回调,因为data可以被多次发出。将该代码放在 res.on('end', ...) 处理程序中。 3 个函数的 res.statusCode = 500。 【参考方案1】:

试试这个,

async.eachSeries(titlesToSave, function (title, index, next) 
  titleValidator.validateAsync(title, function (err) 
    if (err) 
      invalidTitles.push(index: index, error: err);
    

    joinArray[index]();

    next(null);
  ); 
, function (err) 
  console.log(err);
);

【讨论】:

以上是关于多个异步请求的主要内容,如果未能解决你的问题,请参考以下文章

Ajax(jquery) 同时处理多个异步请求

flutter 同时执行多个异步请求回调

多个异步请求

如何使用反应钩子执行多个异步请求?

并行请求多个异步接口

发送多个同时请求时,单线程异步系统中野兽增强异步 http 客户端的行为