javascript - 如何编写一个等待事件在 'returning' 之前触发的 node.js 函数?

标签 javascript node.js asynchronous synchronous

我有一个 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/

相关文章:

javascript - 为什么要使用 readFileAsync 来读取 Node.js 中包含 json 的文件?

node.js - 如何使用 GraphQL 将多封电子邮件以数组格式发送到数据库

javascript - 从异步函数请求结果

javascript - Jquery隐藏确定按钮

c# - 正确调整包含未知尺寸图像的 iframe 的大小

node.js - 在 npm 脚本中重用 package.json 的配置变量

node.js - 如果将文件可写流传递给 Node.js 中的控制台构造函数,是异步写入吗?

javascript - 将复杂的 Javascript 数组发送到 ASP.NET Controller 方法

javascript - 如何使用 axios HTTP 客户端在 node.js 中使用 ContextualWeb News API?

c# - 是否有理由更喜欢这些实现中的一个而不是另一个