如何在Node.js中实现等待

9

这里有一个关于Node.js中简单模式的问题。

以下是我的Coffeescript示例:

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循环永远不会放弃控制权,这似乎是有道理的。然而,我该如何告诉等待函数尝试队列中的下一个回调函数?


3
你不能等待,只能使用回调函数。 - Raynos
2
你基本上是在询问如何以同步的方式编写异步的Node.js代码,这是许多新项目和想法中的热门问题。请查看此链接,其中有很多相关内容:https://dev59.com/72435IYBdhLWcg3w6EmF - tokland
2个回答

4

当我需要运行同步代码时,我喜欢使用async模块

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();
});

基本上,你应该简单地按照文档中列出的模式进行操作。


1
如果我只想打开连接池一次,那么你所做的就没有意义了。我熟悉回调模式。我的问题在于应用程序的初始设置。在运行任何内容之前,应用程序需要进行设置,包括设置数据库,并且必须同步完成。也许这是不可能的,但有没有办法将控制流程返回到事件循环? - Brad C
1
同时,您不希望每次都打开和关闭它,这是浪费的。这是Chris(编写您链接到的库的人)所说的:“一般模式是在启动Web框架之前打开db连接,然后保持打开状态。” 此处 - Brad C
2
也许我漏掉了什么,但为什么不直接在db.open回调中启动Web框架呢?如果这个问题没有解答,你可能需要直接向他询问澄清。 - Matt Ball
2
无论您的模块需要设置哪些IO资源,都可以向其传递回调函数,它会在准备就绪时通知您。您永远不希望在模块中隐式地开始访问IO,用户也不会喜欢这样做。 - fent
@BradC 这完全正确。当JavaScript中的某些东西是异步的时,就没有办法使其同步。像fs.readFileSync这样的东西只有在实现是C++时才可能存在。 - Trevor Burnham
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接