Javascript wait Backbone.Collection.fetch()不等待

Javascript 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.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
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
关键字而不是可用的承诺:)