闭包混淆:在jQuery承诺完成时访问对象

闭包混淆:在jQuery承诺完成时访问对象,jquery,coffeescript,requirejs,promise,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

我有这样一个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
这样的对象,而不能访问
foo
bar
?另外,这不是模拟同步代码的正确方法吗。运行只能在承诺解决后运行的代码?基本上,我想:

  • 实例化
    foo
    bar
  • 从服务器获取
    foo
    和/或
    bar
  • 对需要等待提取的
    foo
    bar
    执行所有操作

  • 似乎done可以包含通用的操作(例如,
    console.log“done”
    ),也可以只访问从promise传入的参数。我想我需要使用一个不同的闭包结构或其他什么,但我只是在如何做我想做的事情上画了一个空白。(我不确定这是否是我唯一经历的事情,因为我在AMD模块内,所以我也在用RequireJS标记它)。

    将其粘贴到Try CoffeescriptREPL at

    产生以下结果:

    /*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);
      });
    });
    
    您的闭包应该可以访问
    foo
    bar
    。因此,我不确定您遇到的问题是否与
    done
    回调中的变量访问不同


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

    是的,您是对的;这很有效。显然,我把这个例子简化了。我将尝试更新它,以反映更多的真实代码。
    /*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);
      });
    });