未定义异步并行回调

时间:2017-05-07 01:30:29

标签: javascript node.js callback async.js

我收到错误"回调未定义"当试图使用async.parallel但我没有引导原因。 async.parallel的所有示例都具有内联函数(如async doco https://caolan.github.io/async/docs.html#parallel),但由于我想要运行的函数中有一些逻辑,我试图将它们拆分出来,因此它们不是内联函数。这可能是我的问题,但我认为应该是可能的,我只是无法从示例中弄清楚回调在这种情况下应该如何工作。

那么这里的目的是让两个函数从不同的位置获取ID列表然后将它们放在一起并在结果数组上做一些事情。我已经削减了"去做其他事情"因为在这个阶段似乎无关紧要。

var structuresIDArray = [];

function getPublicStructures(callback){
    request({
        url: 'https://esi.tech.ccp.is/latest/universe/structures/?datasource=tranquility',
        method: 'GET'
    }, function (error, response, body) {
        if(!error && !body.error && response.statusCode === 200){
            console.log('getting public locations');
            structuresIDArray.concat(JSON.parse(body));
            callback(null, structuresIDArray);
        }else{
            callback(error);
        }
    });
}

function getAssetLocationList(callback){
    db.any('select distinct "location_id" from "public"."charassets" where "location_id" is not null')
    .then(function (data) {
        for (var i = 0; i < data.length; i++) {
            structuresIDArray.push(data[i].location_id);
            if(i+1===data.length){
                callback(null, structuresIDArray);
            }
        }

    })
    .catch(function (err) {
        callback(err);
    });
}



function main(){

    async.parallel([ getAssetLocationList(callback), getPublicStructures(callback) ],
        function (err, results) {
            if (err) {
                throw err;
            }
            // Go do some other stuff now ...
        });
}

2 个答案:

答案 0 :(得分:0)

您需要提供与async.parallel并行执行的函数数组 所以你需要做如下的事情

    async.parallel([getAssetLocationList,getPublicStructures],function(err, results) {
       //This callback executes when both the above functions have called their respective callbacks.
       //results[0] will contain data from getAssetLocationList
       //results[1] will contain data from getPublicStructures
    });

基本上我正在更改的主要功能是getAssetLocationList(callback)getAssetLocationListgetPublicStructures(callback)getPublicStructures

答案 1 :(得分:0)

据我所知,它不起作用的原因是这样做:

async.parallel([ 
  getAssetLocationList(callback),
  getPublicStructures(callback)
],
function (err, results) {
  if (err) {
    throw err;
  }
});

您正在调用 getAssetLocationList(callback)getPublicStructures(callback) 向它们传递一个不存在的变量 callback,因此错误回调未定义。< /p>

你应该这样做:

async.parallel([
 function(callback) {
   getAssetLocationList(callback);
 },
 function(callback) {
   getPublicStructures(callback);
 }
],
function (err, results) {
  if (err) {
    throw err;
  }
});

在这种情况下,它起作用是因为您正在使用刚刚在内联函数定义中定义的参数 callback 调用 getter 函数 function(callback) {...}