Nodejs / Async:回调如何在async.map的iteratee函数中工作,如代码片段中所述

时间:2017-05-01 07:23:40

标签: node.js async.js

刚接触nodejs和async以下是我遇到的代码。

app = express();
/*
other express use calls like - app.use(bodyParser.json());
*/

var async = require("async");
var server;

app.post('/callType/call', function(req, res) {
    var startTime = Date.now();
    server = req.body.server;

    //async.map asynchronuously call enrollStep1 for every element in the req.body.nodes array
    //HOW DOES THIS WORK??!! - WHERE IS THE CALLBACK DEFINED OR SOURCED FROM???
    //******************************************************        
    async.map(req.body.nodes, function(node, callback) {
            someFunc(node.property1,node.property2,callback)
        },
        //This function is called when every task triggered by async.map has called its callback.
        function(err, results) {
            var response = {};
            if (err) {
                response.success = false;
                response.error = err;
                console.log("ERROR returned: " + JSON.stringify(response));
                res.json(response);
            } else {
                var returnResults = [];
                //Results is an array of array - flatten it 
                var flattenedResults = [].concat.apply([], results);
                //then remove duplicates
                for (var i = 0; i < flattenedResults.length; i++){
                    var obj = flattenedResults[i];
                    var isDup = returnResults.some(function(element) {
                        return element.tid === obj.tid;
                    });
                    if (!isDup) {
                        returnResults.push(obj);
                    }
                }

                response.success = true;
                response.results = returnResults;
                res.json(response);
            }
        });
});

function someFunc(property1, property2, callback) {
    var url = '/'+callTypes +'/'+ call  +'/'+ property1 +'/'+ property2
    urClient
        .get(server + url)
        .header('Content-Type', 'application/json')
        .end(
            function(response) {
                if (response.code !== 200) {
                    callback("Error " + ". Code: " + response.code + " Response: " + JSON.stringify(response));
                } else {
                    callback("Success " + ". Code: " + response.code + " Response: " + JSON.stringify(response));
                }
            }
        );
}

async.map的iteratee函数有一个定义,从函数(node,callback){开始,但从不分配回调函数。回调如何在这里工作。

是不是应该分配给 callback = myCallbackFunction;

1 个答案:

答案 0 :(得分:1)

async.map有3个参数,数组/对象,映射数据的函数和回调函数,所以你的代码应该是:

async.map(req.body.nodes, someFunc , function(err, results) {
   if (err) return console.log(err);
   console.log(results);
});

您的someFunc应该是:

function someFunc(item, callback) {
   // do something with item
   // it's each item in the original array/object
   callback('The results');
}

这是一个基本示例:http://code.runnable.com/UyR-6c2DZZ4SmfSh/async-map-example-for-node-js