如何在执行下一行代码之前等待Backbone事件触发器完成

时间:2012-02-01 03:46:11

标签: javascript backbone.js

我有一种情况,我打开一个“连接到某个东西”窗口,然后做一个POST请求。

我这样做的方式是:

GlobalEventBus.trigger("connection")
doPost()

现在发生的事情是:打开一个连接窗口,我希望用户输入凭据,然后在窗口打开后立即触发POST请求。

我尝试使用while循环检查一个布尔变量以查看它是否已完成,但是即使在“连接”窗口打开之前,while循环也会被触发。

我之前没有使用过UI或JavaScript的经验。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以使用trigger的可选参数:

  

触发 object.trigger(event, [*args])
  触发给定事件或空格分隔的事件列表的回调。触发器的后续参数将传递给事件回调。

所以你可以这样做:

GlobalEventBus.trigger("connection", function() { doPost() });
// or
GlobalEventBus.trigger("connection", doPost);

然后'connection'事件的监听器将从其参数列表中获取该函数并在适当的时间调用它。您必须要小心,只有一个侦听器调用传递的回调函数或修改回调函数,以便多次调用它只会导致一次doPost()调用。

或者,你可以完全放弃'connection'事件,转而使用一个连接必要回调的简单函数:

app.getConnectionAnd(function() { doPost() });

然后getConnectionAnd()将建立对话框并将传递的函数附加到其“ok”回调。如果您有其他用途,您仍然可以触发事件,但仅仅因为您拥有通用事件总线并不意味着您必须将它用于所有事情。

如果您真的喜欢Backbone活动,那么您可以修改您的应用程序,请避免这个顺序:

GlobalEventBus.trigger("connection");
doPost();

相反,您可以添加另一个触发doPost的事件:

  1. 请注意您想要拨打function() { doPost() }
  2. 的全球无障碍位置
  3. GlobalEventBus.trigger("connection")已被触发。
  4. 听到上述内容的人会抛出对话框询问连接详情。
  5. 对话框建立连接并触发GlobalEventBus.trigger('connected')事件。
  6. 监听'connected'事件的人会查找应该调用的内容,注意它是(1)中的函数,调用它,并将函数调用重置为undefined