我收到错误"回调未定义"当试图使用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 :(得分: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)
到getAssetLocationList
和getPublicStructures(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) {...}