NodeJS同步代码

时间:2015-12-23 14:48:41

标签: javascript node.js synchronization promise q

我有一个用NodeJS编写的服务器。 我想执行一些IO代码(查询远程表)并保持一切,直到表数据被完全处理。

ATM,正在执行此IO代码并返回结果承诺。 我现在的问题是其余的代码正在执行,其中一些代码依赖于在IO代码完成之前无法构造的对象。

我不能把剩下的代码放在"然后"这个承诺的条款,因为它是很多代码,我不认为它是解决这个问题的优雅方式。

我知道NodeJS程序不应该因为IO操作而阻止运行,但是因为这只发生在服务器启动时我可以容忍这个,问题是如何。

所以问题是,如果我有这个代码:

function() {
    var usefulObject;

    var promise = resultOfTableQuery();
    promise.then(result => {
        usefulObject = new usefulObject(result);
    });

    // very long code ...

    app.get('/application/main', 
        (req, req, next) => {
            // bla bla
        },
        usefulObject
    );
}

在承诺结算之前,我怎么能不执行剩余的超长代码? (不将其包装在"然后"子句中)。

2 个答案:

答案 0 :(得分:1)

您的long code做了什么?您可以延迟启动服务器,直到您处理表中的数据。为什么承诺不是你眼中的优雅解决方案?

好吧,既然你不想要承诺,你可以把东西包装成一个函数:

function() {
    var usefulObject;

    var promise = resultOfTableQuery();
    promise.then(result => {
        usefulObject = new usefulObject(result);
        runLongCode();
    });

    function runLongCode(){
        // very long code ...
    }

    // might want to define this after runLongCode finishes executing.
    app.get('/application/main', 
        (req, req, next) => {
            // bla bla
        },
        usefulObject
    );
}

答案 1 :(得分:-1)

你应该真的避免它。但如果你真的需要它。你async。 但在这种情况下,我认为你不应该这样做。优雅的方法是将长代码插入到不同的函数中。类似的东西:

function() {
var usefulObject;

var promise = resultOfTableQuery();
promise.then(result => {
    longCode();
    usefulObject = new usefulObject(result);
});
function longCode() {
// very long code ...
}
app.get('/application/main', 
    (req, req, next) => {
        // bla bla
    },
    usefulObject
);

}

使用async,它将如下所示:

var data;
async.series([
    function(callback){
        usefulObject = new usefulObject(result);
    },
    function(callback){
            app.get('/application/main', 
                 (req, req, next) => {
                  // bla bla
                  },
                  usefulObject
             );
    },
]);