使用jQuery延迟管道最简洁的方法是什么?

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的例子,我可以在某处模拟?

Bre*_*ood 0

我已经通过内部承诺完美地实现了这一点,因此我立即创建了一个没有数据的 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)