【问题标题】:async parallel callback is not defined未定义异步并行回调
【发布时间】:2017-10-05 05:39:40
【问题描述】:

我在尝试使用 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 ...
        });
}

【问题讨论】:

  • 你在 main 函数中调用 getAssetLocationList(callback), getPublicStructures(callback) ... callback 是什么 - 看起来你没有在任何地方定义它 - 我想你的意思是 async.parallel([ getAssetLocationList, getPublicStructures ] ... - 但我'我一点也不熟悉async.js
  • 看来可以,谢谢。我对传递回调和执行此操作的各种方法很感兴趣,但将其完全删除是可行的。我不确定为什么会这样,但我会回到谷歌并努力理解回调。谢谢!

标签: javascript node.js callback async.js


【解决方案1】:

据我了解,它不起作用的原因是因为这样做:

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

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

你应该这样做:

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

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

【讨论】:

    【解决方案2】:

    您需要提供与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

    【讨论】:

      【解决方案3】:

      当您调用它时,变量“回调”似乎不在范围内。尝试将其添加到这些函数的参数列表中。

      喜欢:

      function (error, response, body, callback)
      ...
      function (data, callback)
      

      【讨论】:

        猜你喜欢
        • 2016-04-03
        • 2018-08-12
        • 1970-01-01
        • 2020-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多