【问题标题】:Node.js: Make sure a piece of code is executed after anotherNode.js:确保一段代码一个接一个地执行
【发布时间】:2012-02-08 19:58:20
【问题描述】:

鉴于此代码:

 c = new Customer 
 c.entry phone,req #how to make sure it ends before the next piece of code?

 db.Entry.findOne {x: req.body.x}, (err,entry) ->

如何确保 db.Entry.findOne 仅在 c.entry 完成后执行?

class Customer
  entry: (phone,req) ->

【问题讨论】:

  • @muistooshort Entry 是 Customer 类下的一个方法。类客户条目:(电话,请求)->
  • Entry可以调整接受回调吗?你需要一些机制来知道 Entry 何时完成它的工作,而回调是主要机制。
  • 所以entry 做了一些异步的事情,你写的?该异步调用应该具有某种“完整”回调,因此将您的findOne 调用向下传递到该回调。
  • @dyoo:是的,回调调用回调调用回调,回调一直向下。

标签: javascript node.js coffeescript


【解决方案1】:

大概你的entry 方法做了一些异步操作,并且 something 应该有一个在完成时运行的回调。所以,只需给entry添加一个回调:

class Customer
  entry: (phone, req, callback = ->) ->
    some_async_call phone, req, (arg, ...) -> callback(other_arg, ...)

我不知道some_async_call 的回调的参数是什么,或者您想要传递给entry 的回调的参数是什么,所以我使用arg, ...other_arg, ... 作为说明性占位符。如果 some_async_callentry 回调的参数相同,那么您可以(如 cmets 中的 Aaron Dufour 注释)只需说:

entry: (phone, req, callback = ->) ->
  some_async_call phone, req, callback

然后将 db.Entry.findOne 调用移动到回调中:

c = new Customer 
c.entry phone, req, -> 
  db.Entry.findOne {x: req.body.x}, (err, entry) ->

entry 内部的细节和回调参数当然取决于entry 正在做什么以及some_async_call 到底是什么。

任何时候您需要等待异步 (Java|Coffee) 脚本中发生的事情,您几乎总是通过添加回调来解决问题。

【讨论】:

  • 您将-> callback() 作为回调传递给some_async_call 而不仅仅是callback 有什么特殊原因吗?我相信它们在功能上是等效的。
  • @AaronDufour:在特定情况下,some_async_call 回调和callback 获得相同的参数(或者它们匹配就callback 而言)那么它们将是相同的。但我不知道some_async_call 做了什么,它的回调得到了什么等等,所以我认为把它拼出来可能更清楚。好问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多