最近我在努力提高我的JavaScript应用程序的质量。
我采用的一个模式是使用单独的“数据上下文”对象来为我的应用程序加载数据(之前我是直接在我的视图模型中进行操作)。
以下示例返回在客户端上初始化的数据:
var mockData = (function($, undefined) {
var fruit = [
"apple",
"orange",
"banana",
"pear"
];
var getFruit = function() {
return fruit;
};
return {
getFruit: getFruit
}
})(jQuery);
在大多数情况下,我们将从服务器加载数据,因此无法立即返回响应。在我们的API中处理这个问题似乎有两个选项:
- 使用回调函数
- 返回一个promise。
以前我总是使用回调函数的方法:
var getFruit = function(onFruitReady) {
onFruitReady(fruit);
};
// ...
var FruitModel = function(dataContext, $) {
return {
render: function() {
dataContext.getFruit(function(fruit) {
// do something with fruit
});
}
};
};
然而,我能理解在构建复杂的 JavaScript 应用程序时如何陷入回调地狱的可能性。
后来,我了解了 Promises 设计模式。不再要求调用者提供回调函数,而是返回一个可观察的“promise”:
var getFruit = function() {
return $.Deferred().resolve(fruit).promise();
};
// ...
dataContext.getFruit().then(function(fruit) {
// do something with fruit
});
我可以看出使用这种模式的明显好处,特别是因为我可以在多个延迟对象上等待wait
,这在加载单页应用程序的初始化数据时非常有用。
然而,在我开始愤怒地使用任何一种模式之前,我很想了解每种模式的优缺点。我也对其他库是否朝着这个方向发展感兴趣。jQuery似乎是这样的情况。
这是一个链接,指向我用于测试的Fiddle。
.done()
等方法即可。 - Pointy