如何 return 在 ajax 完成回调中承诺?

How to return promise in ajax done callback?

我正在尝试使用承诺来延迟函数:

load: function(){

   var d = $.Deferred();

   $.ajax(......).done(function(resp){
      if(resp.error)
        return d.reject();

      ....
      return rend(); 
   });

   return d.promise();

},

我知道 $.ajax 已经 return 是一个承诺,但是这里 render() 也将是 return 一个承诺,所以我不能只使用 $.ajax 承诺,因为

load.then(function() {   .....  })

应该 运行 在 rend() 完成后。

你知道我怎么能 "merge" rend()d 的承诺吗?

rend().then(function() { d.resolve(); }

调用 rend,然后使用该承诺的 success/failure resolve/reject d

here render() will also return a promise so I cannot just use the $.ajax promise because load.then(function() { ..... }) should run after rend() completes.

是的,你可以!这就是 then over done: it chains the actions 的强大之处,在解析返回的 promise 之前等待回调 (render()) 的结果。

使用

load: function(){
  return $.ajax(…).then(function(resp){
//                 ^^^^
    if(resp.error)
      return $.Deferred().reject(resp.error);

      …
      return render(); 
   }); // this will resolve with the result of your render() promise
       // (or be rejeced with the .error)
},