【发布时间】:2017-10-15 11:21:44
【问题描述】:
testcase.xhtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8" />
<title />
<script src="jquery-3.2.1.js"></script>
<script src="underscore-1.8.3.js"></script>
<script src="backbone-1.3.3.js"></script>
<script src="testcase.js"></script>
</head>
<body />
</html>
testcase.js
class My_Collection extends Backbone.Collection {}
class My_View extends Backbone.View {
async initialize() {
let collection = new My_Collection;
collection.url = 'http://backgridjs.com/examples/territories.json';
console.log(collection);
await collection.fetch();
console.log(collection);
$.extend(this, {collection});
return this;
}
render() {
console.log('render→→→', Date.now(), this.collection);
this.collection.map(foo => foo);
}
}
const view = new My_View;
view.render();
结果是
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…" }
尽管有await,但请注意乱序执行。 Collection.fetch() is documented to return 一个实现 Promise 的 jqXHR。
我希望执行在 fetch() 上等待,将集合数据附加到视图,并呈现为不会在未定义的值上崩溃。我看不出哪里出错了。正确的代码是什么样的才能使其按预期工作?
【问题讨论】:
-
无论调用什么初始化,我都认为它会返回一个 Promise 并等待它解决(使用 await 或 .then),然后再继续......对吗?
-
@JaromandaX 不,它没有......
-
$.extend(this, {collection});为什么要使用 jQuery 的extend进行简单的赋值? -
Emile B:因为这是真实代码的simplification,在这个地方有多重赋值。忽略这一点,它与问题无关。
标签: javascript jquery backbone.js async-await es6-promise