2016-02-25 40 views
0

下面将通过错误处理后回流到成功链:

asyncThatWillFail().then(null, function() { 
    //handle error 
    return $.Deferred().resolve(); 
}).then(nextSuccessCallback); 

在我的特殊情况下,虽然,我需要使用$.when.apply($, promises)方法错误处理程序来执行多个并行异步操作:

asyncThatWillFail().then(null, function() { 
    var promises = []; 
    for (var i = 0; i < 3; i++) { 
     var dfd = $.Deferred(); 
     setTimeout(function() { 
      dfd.resolve(); 
     }, 1000); 
     promises.push(dfd.promise()); 
    } 
    return $.when.apply($,promises); 
}).then(nextSuccessCallback); 

我曾假设上述将工作,因为我回来的承诺,最终将得到解决。这个jsFiddle虽然表明,在通过我的错误处理程序后,以下成功或错误回调都不会被调用。

由于错误处理程序中的操作是异步的,我不能继续并通过返回发送一些解析值。不知道该从哪里出发。

+0

的承诺的事情会的工作来解决,但你必须只有一个你正在解决的'dfd'变量。 – Bergi

回答

1

你现在的问题是关闭...只有在3循环的最后创建承诺会因停业

asyncThatWillFail().then(null, function() { 
    log("error handler"); 
    var promises = []; 
    for (var i = 0; i < 3; i++) { 
     (function() { // IIFE for a closure 
      var dfd = $.Deferred(); 
      setTimeout(function() { 
       dfd.resolve(); 
      }, 1000); 
      promises.push(dfd.promise()); 
     }()); 
    } 
    return $.when.apply(null,promises); 
}).then(nextSuccessCallback, nextFailCallback); 

function asyncThatWillFail() { 
    var dfd = $.Deferred(); 
    setTimeout(function(){ 
     dfd.reject(); 
    }, 1000) 
    return dfd.promise(); 
} 

function nextSuccessCallback() { 
    log("success"); 
} 

function nextFailCallback() { 
    log("failure"); 
} 

function log (msg) { 
    $("#logger").append("<p>"+msg+"</p>"); 
} 

看到更新fiddle

+0

啊忘了...希望我可以在浏览器中使用ES6'let' – thedarklord47

相关问题