如何在 Node.js 中等待

Posted

技术标签:

【中文标题】如何在 Node.js 中等待【英文标题】:How to Wait in Node.js 【发布时间】:2012-02-11 12:07:37 【问题描述】:

这是一个关于我认为节点 js 中的简单模式的问题。

这是我在咖啡脚本中的示例:

db_is_open = false

db.open ->
  db_is_open = true

wait = ->
wait() until db_is_open

javascript 中再次出现:

var db_is_open = false;

db.open(function() 
  db_is_open = true;
);

function wait() ;
while (not db_is_open)  wait();

这根本不起作用,因为 while 循环永远不会放弃控制,我想这是有道理的。但是如何告诉等待函数尝试队列中的下一个回调?

【问题讨论】:

等不及了,只能使用回调 你基本上是在问如何以同步方式编写异步node.js代码,这是一个有很多新项目和新想法的热点问题。检查此链接,尽管它们很多:***.com/questions/5139381/node-js-async-libs 【参考方案1】:

当我有一些需要同步运行的代码时,我喜欢使用async module。

var async = require('async');

async.series([
  function(next)
    db.open(next)
  
, function(next)
    db.loadSite('siteName', next)
  
], function(err)
  if(err) console.log(err)
  else 
    // Waits for defined functions to finish
    console.log('Database connected')
  
)

【讨论】:

【参考方案2】:

您为什么要等待,而不仅仅是使用在传递给db.open 的函数内部运行的回调?这是非常惯用的 Node 代码:

db.open(function() 
  // db is now open, let's run some more code
  execute_db_query();
);

基本上,您只需遵循the documentation 中列出的模式即可。

【讨论】:

好吧,如果我只想打开一次连接池,那么你所做的就没有意义了。我熟悉回调模式。我的问题是应用程序的初始设置。应用程序需要在运行任何东西之前进行自我设置,这包括设置数据库,并且需要同步完成。也许这是不可能的,但有没有办法让控制流返回事件循环? 另外你不想每次都打开和关闭很浪费。这是克里斯(编写您链接到的库的人)所说的“一般模式是在启动 Web 框架之前打开数据库连接,然后将其保持打开状态。” here 也许我遗漏了一些东西,但为什么不在db.open 回调中启动Web 框架呢?如果这没有回答,你可能只想直接问他澄清。 感谢您的回复,但我想我上面描述的“等待模式”目前在 Node.js 中是不可能的。换一种说法,就像说 require("somelib"); ,然后 somelib 有一些它必须设置的异步资源。那么我正在导入该模块的代码如何知道“somelib”是否已完成设置? 无论您的模块必须设置什么 IO 资源,您都可以将回调传递给它,它会告诉您何时准备就绪。你永远不想在你的模块中隐式开始访问 IO,用户不会喜欢这样。

以上是关于如何在 Node.js 中等待的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 Node.js (JavaScript) 中等待? l 需要暂停一段时间

如何防止 Node.js 在等待回调时退出?

如何编写一个在“返回”之前等待事件触发的 node.js 函数?

node.js 和 express:如何等待 udp 响应

如何在 node.js 中使用 axios 循环许多 http 请求

Node.js 等待循环中读取的所有文件