2017-05-07 57 views
0

當我嘗試使用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 ... 
     }); 
} 
+0

你正在調用'getAssetLocationList(callback),getPublicStructures(callback)'在函數main ...什麼是'callback' - 看起來不像你定義的任何地方 - 我想你的意思是'async.parallel ([getAssetLocationList,getPublicStructures] ...' - 但我並不完全熟悉'async.js' –

+0

這似乎是謝謝。我被掛在回調和各種方式,但刪除它完全有效我不確定爲什麼這個工程,但我會回到谷歌和工作對回調的理解。謝謝! –

回答

0

它看起來像調用它時變量「回調」不在範圍內。嘗試將它添加到這些函數的參數列表中。

像:

function (error, response, body, callback) 
... 
function (data, callback) 
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您的主要功能。