Javascript then()chaining - 哪个Deferred做第二个then()对应?

时间:2016-04-03 19:30:09

标签: javascript promise deferred

1)我有一个jquery then()链,如下所示:

someAjax().then(function(val) { console.log("done 1: " + val); return val + 1; },
                function(val) { console.log("fail 1: " + val); return val + 2; },
                function(val) { console.log("prog 1: " + val); return val + 3; }

         ).then(function(val) { console.log("done 2: " + val) },
                function(val) { console.log("fail 2: " + val) },
                function(val) { console.log("prog 2: " + val) }
         )

据我所知, first then()的三个函数(三个args)对应于someAjax()中Deferred对象的状态。

但是,我不明白,延迟对象做什么 second 的三个函数(args)对应?例如,如果(或者有可能) first then()的三个函数中的每一个都可以返回其自己的Deferred对象,该怎么办?

我觉得我可能会在这里误解一些东西。感谢任何澄清。

/////////////////////////////////////////////// /////

2)我有另一个这样的链接:

$.getJSON(url).then(
                doneFunction1,
                errorFunction1
            ).then(
                doneFunction2
            });

doneFunction1如下所示:

function doneFunction1(val){
   if(val > 1)
      return $.ajax(url2);
}

因此,根据val,这并不总是会返回一个承诺。 如果它没有返回Promise(比如val< 1),那么第二个怎么办呢?这会导致错误吗?因为据我所知,没有Promise可以调用then()。我的猜测是它可能只调用$.getJSON的第一个Promise的then(),但我可能错了。

基本上,当'val<时,我试图不要有第二个then()。 1&#39 ;.有可能吗?

1 个答案:

答案 0 :(得分:1)

您只需返回已解决或已拒绝的延期

function doneFunction1(val){
    if(val > 1) {
        return $.ajax(url2);
    } else {
        var def = $.Deferred();
        return def.reject(); // or def.resolve('something'); to hit the success handler
    }
}

$.getJSON(url).then(
    doneFunction1,
    errorFunction1
).then(
    doneFunction2,
    errorFunction2 // only needed if you want to catch the error
});