闭包混淆:在jQuery承诺完成时访问对象
我有这样一个AMD模块:闭包混淆:在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
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);
});
});