Node.js:违反了异步非阻塞控制流

时间:2014-10-13 23:46:14

标签: javascript node.js asynchronous async.js

我的一条路由处理传入的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会解决这个问题(还没有和他们一起工作,所以试图尽可能地避免它们;))?

0 个答案:

没有答案