【问题标题】:Checking for delayed asynchronous code in NodeJS在 NodeJS 中检查延迟的异步代码
【发布时间】:2013-09-10 22:42:58
【问题描述】:

一个有点棘手的问题,首先,我有一个插件:

exports.action = function(){
  // Running synchronous code
  runMyRequest("path/to/url", function(){
    // My code is asynchronous
  });
}

然后我从一个需求中调用这个插件:

var plugin = require('myplugin')
plugin.action();
// continue stuff

问题:在“继续工作”中有什么方法可以检查“我的代码是异步的”是否正在运行或完成?那么等着呢?

注意:在我的真实代码中插件必须调用回调()。这个问题的目的是在插件的代码忘记调用我的回调()时做点什么

【问题讨论】:

  • 我在想像 Java 或 C# 中的 Join() 功能。
  • 你不理解闭包。如果未调用回调,则永远不会运行“我的代码是异步的”。问题不在于“它正在运行”还是“它已经完成”,它永远不会运行。节点(和 V8)中没有暴露“线程”,因此不可能有 join()。 Node 允许程序员停止或使服务器崩溃。它不是为处理草率的代码而设计的。基于超时的唯一解决方法是 djbrick 提供的解决方法。
  • @Lucio 是的,我说的是 Join() 以便更好地理解。我在想丑陋的 while/timeout 循环查看 Event Loop 以查看此模块是否有活动

标签: node.js asynchronous


【解决方案1】:

我不这么认为,但是如果插件在特定时间段内没有调用回调,你可以使用setTimeout 来调用函数。如果调用回调,则清除超时。

【讨论】:

  • 是的,这是一种解决方法。我正在考虑使用 Java 或 C# 中的 Join() 功能或低级 NodeJS 功能来跟踪函数调用。
【解决方案2】:

问题:...等一下?

我最近创建了一个名为 WaitFor 的简单抽象,用于在同步模式下调用异步函数(基于 Fibers):https://github.com/luciotato/waitfor

首先,“action”应该有一个回调作为参数,因为它在您的示例中编写,它是一个异步函数(立即返回)但它没有回调。

带有 wait.for 的代码:

exports.action = function(callback){
  // Running synchronous code
  runMyRequest("path/to/url", function(){
    // My code is asynchronous
    ...
    callback(err,data);
  });
}

然后从 require 中调用这个插件:

var wait = require('wait.for')
var plugin = require('myplugin')

...in a fiber...
wait.for(plugin.action); // waits until callback is called (WITHOUT BLOCKING NODE)
// continue stuff 

Wait.for 将在需要时为您提供其他优势,例如顺序 try-catch 编程。

【讨论】:

  • 正如我所说,真正的代码确实有一个回调,但我想检查插件何时不调用 callback(err,data);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2011-10-18
  • 2016-02-02
  • 1970-01-01
  • 2019-03-13
  • 2018-08-01
  • 2018-06-13
相关资源
最近更新 更多