Bre*_*ood 5 jquery deferred jquery-deferred
我正在设计一个包装我的REST API的JavaScript API.我通常希望避免大量冗长和混乱的嵌套回调,并且已经阅读了Deferred jQuery的优点.
让我们想象一下我的库'myLib',它代表人物对象和人物之间的遍历方式.它有一堆方法,比如'爸爸','老板','助手'等需要做一个ajax请求来查找一些数据并返回另一个相关的'people'对象.但我希望他们返回一个延迟对象,该对象也有myLib的方法,我可以链接在一起,编写真正简洁的简单代码,如下所示:
myLib('me').dad().boss().assistant(function(obj){
alert(obj.phone); // My dad's, bosses assistants phone number
}, function(){
alert('No such luck);
});
Run Code Online (Sandbox Code Playgroud)
这会创建一个'我'人物对象,然后进行第一次ajax调用以查找我的详细信息,然后使用该数据进行另一次调用以找出我的父母,然后再次找到我的老板,然后再找到另一位助手,然后最后,这传递给我的回调,我处理它.有点像jQuery的链式遍历方法,但异步.
在任何一点传递函数,但通常是最后一个方法,在解析链中的最后一个Deferred对象时将在内部调用.第二个函数是失败回调,如果链中的任何延迟对象被拒绝,则调用该函数.
我想我需要创建一个jQuery延迟对象,然后扩展它但不确定这是否是"最佳"方式.
那么实现我的极简主义API目标的最佳实践方法是什么?基本上我希望所有的方法名称在域问题名称空间中都是100%,并且没有被大量的'when','done','success'等污染.
是否有类似的清洁API的例子,我可以在某处模拟?
我已经通过内部承诺完美地实现了这一点,因此我立即创建了一个没有数据的 Person 对象。它包含的只是对稍后数据的承诺。方法类似于 Parent() 创建一个新的 Promise,该 Promise 脱离了当前的 Promise。可能有一种方法可以使用 pipeline() 来简化此操作,但尚未完全弄清楚。
myLib = {
find: function(id){
var person = new Person();
person.promise = $.ajax(.....);
}
};
function Person(){
}
Person.prototype.parent(){
var person = this;
var parent = new Person();
var deferred = $.Deferred();
this.promise.then(function(data){
var promise = $.ajax({url: '/person/'+data.parent+'/json'});
promise.done(function(obj){
person.data = obj.data;
deferred.resolve(node);
});
}, function(error){
deferred.fail();
});
parent.promise = deferred.promise();
return parent;
}
Person.prototype.get(callback){
this.promise.then(function(data){
this.data = data;
callback(this);
});
}
Usage/Test:
myLib.find('12345').get(callback);
myLib.find('12345').parent().get(callback);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1155 次 |
| 最近记录: |