我的一条路由处理传入的HTTP-POST请求,以在数据库(使用Mongoose的MEAN环境)中创建新的书籍条目。主处理程序使用异步瀑布进行一系列操作,如:
async.waterfall([
{...},
//extract book-hashtags from single string
function(input, callback){
hashtags.extractHashtags(req.body.hashtags, function(err, tagresult){
if(tagresult){
callback(null, tagresult, input);
}
});
},
//save hashtag-result-array to database
function(callback){
callback(null);
[...]
}
], function (err, result) {
//...
});
我的extractHashtags函数如下所示:
exports.extractHashtags = function(inputString, cb){
async.series([
//remove special characters
function(callback){
//...
callback(null, results);
},
//remove all whitespaces
function(callback){
//...
callback(null, results);
},
//extract hashtag-substrings
function(callback){
//...
callback(null, results);
}
],
// final callback
function(err, hashtagarray){
//finally done, NOW return FINAL result
cb(null, hashtagarray);
});
};
我的问题:主处理程序(瀑布代码)中的代码不会等待“extractHashtags”返回的最终结果。同时,你可以说,我的extractHashtags函数可以多次发送回调,即使它没有完全完成它的工作。相反,我从系列链的每个处理步骤(在这种情况下是3x回调)中获得回调。结果,数据库写入发生了3次。我想,通过使用async.series,我只在整个处理完成后发送一个回调。我也遇到了与其他函数类似的问题,我认为它们都与同一个问题有关:控制流程不是完全异步证明。
1)有什么方法可以保留当前代码并引入微小的更改来实现所需的(顺序)控制流而不切换到阻塞代码?
2)如果没有,Promise会解决这个问题(还没有和他们一起工作,所以试图尽可能地避免它们;))?