2

我的问题如下:

我在 Node 中有很多 Mysql 请求要做,而且它是异步完成的。

在下面的示例中,我想在函数 doStuffWithInput 开始之前等待 checkExists 函数以一种或另一种方式完成(并填充我的输入变量)。除了在各种可能的回调中(在每个'input=keys;'之后)多次粘贴 doStuffWithInput 之外,我没有看到任何其他方法......我相信有更好的方法。有任何想法吗?

var input;

db.checkExists_weekParents(id,function(count){ //check table existence/number of rows
    if(count!==='err'){ //if doesnt exist, create table
        db.create_weekParents(id,function(info){ 
            if(info!=='err'){ //as table is empty, create input from a full dataset
                db.makeFull_weekParents(id,function(keys){
                    input = keys;       
                });
            }
        });
    }else{ //if exists, check number of entries and create input keys as a subset of the full dataset
        db.makeDiff_weekParents(id,function(keys){
            if(keys.length!==0){
                input = keys;
            }else{ //if the table already has full dataset, we need to export and start again.
                db.export_weekParents(id,function(info){
                    db.create_weekParents(id,function(info){
                        if(info!=='err'){
                            db.makeFull_weekParents(id,function(keys){
                                input = keys;       
                            });
                        }
                    });
                });
            }
        });
    }
});

完成所有这些后,我们还有很多事情要做(生成子进程、更多数据库操作等...)

doStuffWithInput(input,function(output){
    //Tons of stuff here
    console.log(output);
})

我真的希望这足够清楚,如果需要,我会澄清。

编辑

尝试使用 Promise 重写似乎是最好的方法,我想这对于像我这样在末日金字塔中挣扎的其他人来说是一个很好的例子。到目前为止,我有:

    var Q = require('q');   
    function getInput(){
        var dfd = Q.defer();
        db.check_weekParents(id,function(count){
            console.log('count '+count);
            if(count==='err'){
                db.create_weekParents(id,function(info){
                    if(info!=='err'){
                        console.log('created table');
                        db.makeDiff_weekParents(id,function(keys){
                            input = keys;
                            dfd.resolve(input);
                        });
                    }
                });
            }else{
                db.makeDiff_weekParents(id,function(keys){
                    input=keys;
                    dfd.resolve(input);
                });
            }
        });
        return dfd.promise;
    }
    getInput().then(function (input) {
        console.log(input);
    });

太神奇了!!

4

2 回答 2

2

您可以使用承诺而不是回调。node中有很多可能性,你使用的mysql库甚至可能支持它们。例如Q

function getInput(){
    var dfd = Q.defer();
    if(count!==='err'){
        db.create_weekParents(id,function(info){
            /* after everything completes */
            dfd.resolve(input);

/* snip */

    return dfd.promise;
}

然后你可以做

getInput().then(function (input) {
    doStuffWithInput(input ...
});
于 2013-11-06T19:19:14.030 回答
2

您应该考虑使用异步库。

对于您的情况,您可能希望使用瀑布模式。这些函数将按顺序执行,每个函数的结果将作为输入传递给下一个函数。从这里,您可以检查以前功能的结果等。

您还可以以任何您想要的方式组合不同的控制流结构。(即,在瀑布流的一个阶段并行操作)

于 2013-11-06T19:20:05.257 回答