关闭混乱:在jQuery承诺完成后访问对象

时间:2013-06-17 00:13:43

标签: jquery coffeescript requirejs promise

我有一个像这样的AMD模块:

define ['backbone', 'jquery', 'someObj'], (Backbone, $, someObj) ->

  class MyModel extends Backbone.Model
    # some options

  foo = new MyModel
  bar = new MyModel

  foo.fetch().done ->
    # Here I want to do things with foo and bar now that the fetch is complete
    # but they are not visible
    # Backbone, $, someObj, and MyModel are all visible, however

为什么我可以访问someObj之类的对象,而不是foobar?此外,这不是模拟同步代码的正确方法,即。运行只能在解析承诺后才能运行的代码?基本上,我想:

  1. 实例化foobar
  2. 从服务器
  3. 获取foo和/或bar
  4. foobar做所有需要等待获取的事情
  5. 似乎已完成可以包含通用的操作(例如console.log "Done")或仅访问从promise传递给它的参数。我想我需要使用不同的闭包结构或其他东西,但我只是在如何做我想要的事情上画一个空白。 (我不确定这是否只是我遇到的事情,因为我在AMD模块中,所以我也用RequireJS标记这个。)

1 个答案:

答案 0 :(得分:1)

将此内容粘贴到http://coffeescript.org/尝试Coffeescript REPL中...

define ['backbone', 'jquery', 'someObj'], (Backbone, $, someObj) ->

  class MyModel extends Backbone.Model
    # some options

  foo = new MyModel
  bar = new MyModel

  foo.fetch().done ->
    # Here I want to do things with foo and bar now that the fetch is complete
    # but they are not visible
    # Backbone, $, someObj, and MyModel are all visible, however
    console.log foo, bar

产生这个:

/*snip boilerplate*/
define(['backbone', 'jquery', 'someObj'], function(Backbone, $, someObj) {
  var MyModel, bar, foo, _ref;
  MyModel = (function(_super) {
    __extends(MyModel, _super);

    function MyModel() {
      _ref = MyModel.__super__.constructor.apply(this, arguments);
      return _ref;
    }

    return MyModel;

  })(Backbone.Model);
  foo = new MyModel;
  bar = new MyModel;
  return foo.fetch().done(function() {
    return console.log(foo, bar);
  });
});

您的关闭似乎可以访问foobar。所以我不确定你得到的问题是否与done回调中的变量访问不同。

听起来您必须在浏览器中调试代码才能验证您是否可以看到应该看到的变量。