【问题标题】:Async issues for multiple POST request多个 POST 请求的异步问题
【发布时间】:2017-08-08 08:52:16
【问题描述】:

我使用函数_getLogFileUrls 执行POST 请求并将数据返回给回调函数。返回的数据正在添加到数组中。

函数_getLogFileUrls 在循环中被调用。

所有请求完成后如何返回结果数组?

我知道setTimeout 是这种方法的错误方式,而我编写代码的方式是创建回调地狱。我如何摆脱setTimeout 函数而不涉及各种异步问题。

// app.post('/api/getLogs', auth, loggingAPI.getLogs); // Make API request

function getLogs(req, res) {
    if ( ! req.body.id) {
        return res.status(500).send('Please check the params!');
    }

    var date;

    if (req.body.date) {
        date = req.body.date;
    } else {
        date = new Date().toISOString().slice(0,10);
    }

    var sqlQuery = "SELECT `LogFileID` FROM `logs_data` WHERE `EmpID` = '" + req.body.id + "' AND DATE(`Timestamp`) = '" + date + "'",
        resArray= [];

    hitThisQueryForMe(sqlQuery, res, function(rows) {
        if ( ! rows.length) res.json(rows);

        _.each(rows, function(item) {
            console.log('item: ' + item.LogFileID);
            _getLogFileUrls(item.LogFileID, function(response) {
                resArray.push(response);
            });
        });

        setTimeout(function() {
            console.log('final urls: ' + JSON.stringify(resArray));   
            res.send(resArray);
            resArray = [];
        }, 4000);

    });
}

function _getLogFileUrls(logFileId, callback) {
  var request = require('request'),
    config = require('../../config.js');    

    var fileParams = {
        fileName: 'LogFiles/' + logFileId       
    };

    request.post({
        url: config.filesServiceUrl + 'get-logfile-urls',
        json: fileParams
    }, function(error, response, body) {
        if (!error && response.statusCode === 200) {
            callback(body);
        } else {
            console.log('err requesting  logs: ' + JSON.stringify(error));
            res.status(400).send('Err requesting  logs:');
        }
    }).on('error', function(err) {
        console.log('File service error for Logs: ' + err);
    });
}

【问题讨论】:

    标签: javascript node.js asynchronous settimeout


    【解决方案1】:

    使用 async.eachOf 迭代您的数组并对每个元素应用异步函数:

    async.eachOf(myArray, function(myElementInArray, it, callback){
    
        // call async function on element
        myAsyncFunction(myElementInArray, function(err){
           if(err)
             return callback(err); // abort async flow
           else
             return callback(); 
        });
    
    }, function(err){
      // final callback called when the flow is finished
    
    });
    

    //// 编辑

    异步模块文档:https://caolan.github.io/async/docs.html

    替换此代码:

            _.each(rows, function(item){            
                console.log('item: ' + item.LogFileID);
                _getLogFileUrls(item.LogFileID, function(response){
                    resArray.push(response);            
                });         
            });
    
            setTimeout(function(){
                console.log('final urls: ' + JSON.stringify(resArray)); 
                res.send(resArray);
                resArray = [];
            }, 4000);
    

     var async = require("async");
     var resArray = [];
     async.eachOf(rows, function(item, it, callback){
    
        console.log('item: ' + item.LogFileID);
        // call async function on element
         _getLogFileUrls(item.LogFileID, function(response){
             resArray.push(response);
             return callback(); 
        });
    
    }, function(err){
      // final callback called when the flow is finished
       console.log('final urls: ' + JSON.stringify(resArray)); 
       res.send(resArray);
    });
    

    【讨论】:

    • 不确定我明白了,你的意思是使用异步模块吗?然后调用 _getLogFileUrls 代替 myAsyncFunction?
    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2016-10-05
    • 2016-11-11
    • 2019-03-05
    • 1970-01-01
    相关资源
    最近更新 更多