Javascript wait Backbone.Collection.fetch()不等待
testcase.xhtmlJavascript wait Backbone.Collection.fetch()不等待,javascript,jquery,backbone.js,async-await,es6-promise,Javascript,Jquery,Backbone.js,Async Await,Es6 Promise,testcase.xhtml 结果是 testcase.js:13:9 Object { length: 1, models: Array[1], _byId: Object, url: "http://backgridjs.com/examples/terr…" } testcase.js:21:9 render→→→ 1494928366647 undefined testcase.js:22:9 TypeError: this.collection is undefined testc
结果是
testcase.js:13:9 Object { length: 1, models: Array[1], _byId: Object, url: "http://backgridjs.com/examples/terr…" }
testcase.js:21:9 render→→→ 1494928366647 undefined
testcase.js:22:9 TypeError: this.collection is undefined
testcase.js:16:9 Object { length: 242, models: Array[242], _byId: Object, url: "http://backgridjs.com/examples/terr…" }
请注意,尽管有wait
,但仍会出现无序执行。履行诺言的人
我希望执行等待fetch(),将集合数据附加到视图,并在未定义的值上呈现为不崩溃。我看不出哪里出了问题。正确的代码是什么样的,才能使其按预期工作?请注意以下几点:
async initialize() {
您使初始化
异步,现在无法保证在调用view.render()时代码>初始化
已完成执行。您必须访问async initialize()
返回的承诺,并在问题解决后调用render
,我不确定是否可以使用主干网,因为即使是1.3.3源代码(最新版本afaik)看起来也是这样:
var View = Backbone.View = function(options) {
this.cid = _.uniqueId('view');
_.extend(this, _.pick(options, viewOptions));
this._ensureElement();
this.initialize.apply(this, arguments);
// ^----- Does not return the promise,
// and shouldn't because this is supposed to be a constructor
};
你会更喜欢老式的
collection.fetch().then(this.render.bind(this));
为什么不使用已有的承诺?请注意以下几点:
async initialize() {
您使初始化
异步,现在无法保证在调用view.render()时代码>初始化
已完成执行。您必须访问async initialize()
返回的承诺,并在问题解决后调用render
,我不确定是否可以使用主干网,因为即使是1.3.3源代码(最新版本afaik)看起来也是这样:
var View = Backbone.View = function(options) {
this.cid = _.uniqueId('view');
_.extend(this, _.pick(options, viewOptions));
this._ensureElement();
this.initialize.apply(this, arguments);
// ^----- Does not return the promise,
// and shouldn't because this is supposed to be a constructor
};
你会更喜欢老式的
collection.fetch().then(this.render.bind(this));
为什么不使用已经可用的承诺?我接受initialize调用期望它返回承诺并等待它解决(使用wait或.then)后再继续。。。对吗?@JaromandaX不,它不…$.extend(这个,{collection})代码>为什么要使用jQuery的extend
进行简单的赋值?Emile B:因为这是真实代码的一部分,在这里有多个赋值。忽略这一点,它与问题无关。我接受初始化调用期望它返回承诺并等待它解决(使用wait或.then)后再继续。。。对吗?@JaromandaX不,它不…$.extend(这个,{collection})代码>为什么要使用jQuery的extend
进行简单的赋值?Emile B:因为这是真实代码的一部分,在这里有多个赋值。忽略此项,它与问题无关。您应该将上下文
选项与获取
一起使用,以便使用正确的上下文调用渲染
。然后(this.render)
将渲染
作为引用,而不使用上下文<代码>当集合的承诺得到解决时,渲染内部的此
不会指向视图实例fetch({context:this,success:this.render})
可以使用。@emilebergron是的,这是正确的有很多方法可以绕过这个,context
,bind
,或者arrow函数,因为他正在使用es6,我在选择一个方面有困难:D@daxim调用view.collection.fetch({/*…*/})
在责任对象中,而不是在初始化中。或者只在负责对象的集合上附加一个侦听器。@daxim正如Emile在上面所建议的,您甚至可以将它放在类似{loadDataandender:function(){this.collection.fetch({/*…*/}}}}
的方法中,并从另一个对象调用它,如view.loadDataandender()代码>而不是初始化。。。我的问题是为什么要使用wait
关键字而不是可用的承诺:)您应该将context
选项与fetch
一起使用,这样render
就会被正确的上下文调用。然后(this.render)
将render
作为引用而不使用上下文<代码>当集合的承诺得到解决时,渲染内部的此
不会指向视图实例fetch({context:this,success:this.render})
可以使用。@emilebergron是的,这是正确的有很多方法可以绕过这个,context
,bind
,或者arrow函数,因为他正在使用es6,我在选择一个方面有困难:D@daxim调用view.collection.fetch({/*…*/})
在责任对象中,而不是在初始化中。或者只在负责对象的集合上附加一个侦听器。@daxim正如Emile在上面所建议的,您甚至可以将它放在类似{loadDataandender:function(){this.collection.fetch({/*…*/}}}}
的方法中,并从另一个对象调用它,如view.loadDataandender()代码>而不是初始化。。。我的问题是为什么要使用await
关键字而不是可用的承诺:)