如何在 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 函数?