从 async.each 调用回调函数并处理结果
Calling a callback function from async.each and processing the results
我才刚刚开始使用 Javascript 和 Node,异步和回调概念不是我现在可以控制的。
我必须为文档数组的每个元素调用一个函数。此函数将调用 DB 并为我提供一组文档注释。我想获取所有注释并将它们放在同一个数组中。类似于此:
//function in an async waterfall
function(docs,callback){
let annotationsArray = [];
async.each(docs, (doc, callback2) => {
getAnnotationsFromDocument(doc.Id, callback2);
}, function (err,annotations){
if (err){
callback(err);
}
annotationsArray = annotationsArray.concat(annotations);
callback(null, annotationsArray);
});
},
//Next waterfall function
关于getAnnotationsFromDocument函数,这是它的简化结构:
function getAnnotationsFromDocument(docId,callback){
initDB();
var async = require('async');
async.waterfall([
function authorize(callback){
//checkAuthorization
(...)
},
function getRfpdocAnnotations(auth, metadata, callback){
//call to DB
(...)
},
function processRfpdocAnnotations(rfpDocAnnotations,metadata,callback){
(...)
callback(null,annotationsList);
}
], function (err, result) {
if(err) {
callback(err);
} else {
callback(null, result);
}
});
}
不幸的是,我无法正确编码。在退出 async.each 之前,我无法从函数中获取结果。有人可以解释一下如何为此构建代码吗?
调试我发现函数 getAnnotationsFromDocument 获取数据并正确执行最后一个 callback(null, result);,但是当我到达 函数(错误,注释){,注释未定义。
好的,我想我明白了:
- 第一个问题是 async.each 没有像我预期的那样 return 回调的结果。与瀑布不同,它只是 return 错误。我应该多注意阅读文档。
- 其次,我必须在 getAnnotationsFromDocument 调用上创建一个回调来处理结果。
- 最后,我没有执行对 async.each 回调的调用,所以执行没有到达 async.each 回调,也没有继续下一个 async.waterfall函数。
老实说,我不确定这是一个正确的答案,但它确实达到了我想要达到的目的。
// function part of an async.waterfall
function(docs,callback){
let annotationsArray = [];
async.each(docs, (doc,callback2) => {
getAnnotationsFromDocument(doc._id, function(err,result){
if (err){
callback2(err);
}else{
annotationsArray = annotationsArray.concat(result);
}
callback2();
})
}, (err) =>{
if( err ) {
callback(err);
} else {
callback(null,annotationsArray); //to the next waterfall function
}
});
我才刚刚开始使用 Javascript 和 Node,异步和回调概念不是我现在可以控制的。
我必须为文档数组的每个元素调用一个函数。此函数将调用 DB 并为我提供一组文档注释。我想获取所有注释并将它们放在同一个数组中。类似于此:
//function in an async waterfall
function(docs,callback){
let annotationsArray = [];
async.each(docs, (doc, callback2) => {
getAnnotationsFromDocument(doc.Id, callback2);
}, function (err,annotations){
if (err){
callback(err);
}
annotationsArray = annotationsArray.concat(annotations);
callback(null, annotationsArray);
});
},
//Next waterfall function
关于getAnnotationsFromDocument函数,这是它的简化结构:
function getAnnotationsFromDocument(docId,callback){
initDB();
var async = require('async');
async.waterfall([
function authorize(callback){
//checkAuthorization
(...)
},
function getRfpdocAnnotations(auth, metadata, callback){
//call to DB
(...)
},
function processRfpdocAnnotations(rfpDocAnnotations,metadata,callback){
(...)
callback(null,annotationsList);
}
], function (err, result) {
if(err) {
callback(err);
} else {
callback(null, result);
}
});
}
不幸的是,我无法正确编码。在退出 async.each 之前,我无法从函数中获取结果。有人可以解释一下如何为此构建代码吗?
调试我发现函数 getAnnotationsFromDocument 获取数据并正确执行最后一个 callback(null, result);,但是当我到达 函数(错误,注释){,注释未定义。
好的,我想我明白了:
- 第一个问题是 async.each 没有像我预期的那样 return 回调的结果。与瀑布不同,它只是 return 错误。我应该多注意阅读文档。
- 其次,我必须在 getAnnotationsFromDocument 调用上创建一个回调来处理结果。
- 最后,我没有执行对 async.each 回调的调用,所以执行没有到达 async.each 回调,也没有继续下一个 async.waterfall函数。
老实说,我不确定这是一个正确的答案,但它确实达到了我想要达到的目的。
// function part of an async.waterfall
function(docs,callback){
let annotationsArray = [];
async.each(docs, (doc,callback2) => {
getAnnotationsFromDocument(doc._id, function(err,result){
if (err){
callback2(err);
}else{
annotationsArray = annotationsArray.concat(result);
}
callback2();
})
}, (err) =>{
if( err ) {
callback(err);
} else {
callback(null,annotationsArray); //to the next waterfall function
}
});