3

我正在检查来自 Backbone JQuery 移动示例应用程序 http://jquerymobile.com/test/docs/pages/backbone-require.html的代码

并在集合对象中找到以下内容

// 覆盖 Backbone.sync 方法(Backbone.fetch 方法在尝试获取数据时调用 sync 方法)
同步:函数(方法、模型、选项){

            // 局部变量
            // ===============

            // 实例化一个空数组
            var 类别 = [],

                // 将 this 上下文存储在 self 变量中
                自我=这个,

                // 创建一个 jQuery 延迟对象
                延迟 = $.Deferred();

            // 使用 setTimeout 模拟一个异步检索数据的真实世界应用程序
            设置超时(函数(){

                // 过滤上述示例 JSON 数据以返回仅包含正确类别类型的数组
                类别= _.filter(self.jsonArray,函数(行){

                    返回 row.category === self.type;

                });

                // 调用 options.success 方法并传递一个对象数组(内部将这些对象作为模型保存到当前集合中)
                options.success(类别);

                // 触发自定义的 `adding` 方法(Category View 监听)
                self.trigger("添加");

                // 解析延迟对象(这会触发类别路由器内部的 changePage 方法)
                deferred.resolve();

            }, 1000);

            // 返回延迟对象
            延期退货;

        }

我只是想了解 deferred 被声明和返回的部分,为什么我们甚至需要那个?没有附加回调。而且我真的不明白为什么我们使用 setTimeout 并在其中解析延迟对象。

4

3 回答 3

2

deferred 对象用于管理异步方法——它对于设置成功/错误回调而不创建令人困惑的嵌套回调块很有用。它也非常适合处理需要等待多个异步操作完成的场景。Deferred 与 JQuery AJAX 方法是分开的,但由 JQuery AJAX 方法实现。

作为如何在 Backbone 中使用它的一个示例,请考虑需要从服务器加载一些 JSON 数据和 HTML 模板的情况。在渲染视图之前,您可能需要完成两次异步调用。使用 Deferred 是一种方便的处理方式,因为您可以将多个 Promise 对象传递给when,它们将在所有完成后被调用。

有关 deferred 的信息,值得探索JQuery 站点上的文档


(请注意,虽然那里的代码中没有可见回调,但可以附加成功/错误回调,例如,Backbone.Model.fetch。)

于 2012-11-15T05:32:55.593 回答
1

只需阅读代码:)

// Uses a setTimeout to mimic a real world application that retrieves data asynchronously

延迟对象在创建时不需要附加回调,这就是它们的全部意义所在。你应该阅读它们

于 2012-11-15T05:28:14.697 回答
0

为了可扩展性,如果我正在使用它,我可以在 Deferred 对象上连接处理程序,而无需修改此实现。

setTimeout 纯粹是“展示和讲述”,它在模仿某种服务调用。所以人们可能会像这样消费它:

var myDeferred = myCollection.sync();
myDeferred.error(function() {
     /* error handling */
})
.done(function() { /* clean up state */ });
于 2012-11-15T05:31:52.493 回答