我有一个 Node 应用程序,它不是一个 Web 应用程序 - 它在返回 1 之前完成了一系列异步任务。在返回之前,程序的结果立即打印到控制台。 p>
如何确保所有异步工作在返回前完成?通过确保我们在调用 res.end() 之前完成的所有任务,我能够在 Web 应用程序中实现与此类似的事情,但是在让脚本返回之前,我没有任何等效的方法可以调用最终的“事件”。
目前我的(损坏的)函数见下文,试图等到 callStack 为空。我刚刚发现这是一种荒谬的方法,因为 node 在进入 processObjWithRef 中调用的任何异步函数之前会等待 processHub 完成。
function processHub(hubFileContents){
var callStack = [];
var myNewObj = {};
processObjWithRef(samplePayload, myNewObj, callStack);
while(callStack.length>0){
//do nothing
}
return 1
}
注意:我之前曾多次尝试使用诸如 async 之类的库来实现这种行为(请参阅我在 How can I make this call to request in nodejs synchronous? 处的相关问题),因此在建议任何基于“仅使用”的答案之前,请考虑那里的答案和评论异步”。
最佳答案
您不能在返回之前等待异步事件——这就是异步的定义!试图强制 Node 进入这种编程风格只会让你痛苦。一个简单的例子是定期检查 callstack
是否为空。
var callstack = [...];
function processHub(contents) {
doSomethingAsync(..., callstack);
}
// check every second to see if callstack is empty
var interval = setInterval(function() {
if (callstack.length == 0) {
clearInterval(interval);
doSomething()
}
}, 1000);
相反,在 Node 中执行异步操作的常用方法是实现对函数的回调。
function processHub(hubFileContents, callback){
var callStack = [];
var myNewObj = {};
processObjWithRef(samplePayload, myNewObj, callStack, function() {
if (callStack.length == 0) {
callback(some_results);
}
});
}
如果您真的想返回,请查看 promises ;当它们被解决时,它们保证立即或在将来的某个时间发出事件。
function processHub(hubFileContents){
var callStack = [];
var myNewObj = {};
var promise = new Promise();
// assuming processObjWithRef takes a callback
processObjWithRef(samplePayload, myNewObj, callStack, function() {
if (callStack.length == 0) {
promise.resolve(some_results);
}
});
return promise;
}
processHubPromise = processHub(...);
processHubPromise.then(function(result) {
// do something with 'result' when complete
});
关于javascript - 如何编写一个等待事件在 'returning' 之前触发的 node.js 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9935920/