我有一个用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
);
}
在承诺结算之前,我怎么能不执行剩余的超长代码? (不将其包装在"然后"子句中)。
答案 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
);
},
]);