【发布时间】:2015-08-22 16:02:32
【问题描述】:
这是一种常见的模式,我们在数据源列表中级联,第一次成功打破数据链,如下所示:
var data = getData1();
if (!data) data = getData2();
if (!data) data = getData3();
等等。但是,如果 getDataN() 函数是异步的,它会导致我们进入“回调地狱”:
var data;
getData1(function() {
getData2(function () {
getData3(function () { alert('not found'); })
})
});
实现可能类似于:
function getData1(callback) {
$.ajax({
url: '/my/url/1/',
success: function(ret) { data = ret },
error: callback
});
}
...承诺我会写这样的东西:
$.when(getData1())
.then(function (x) { data = x; })
.fail(function () { return getData2(); })
.then(function (x) { data = x; })
.fail(function () { return getData3(); })
.then(function (x) { data = x; });
第二个.then 实际上是指第一个.fail 的返回值,它本身就是一个承诺,我理解它是作为后续链步骤的输入链接的。
显然我错了,但正确的写法是什么?
【问题讨论】:
-
getData1应该返回$.ajax承诺。 -
第一个想法:您可以继续传递承诺(作为第二个参数),成功时完成承诺,失败时运行回调。
-
我认为你不能在异步函数上这样做。为什么不使用递归回调和简单的 if-else?
-
什么是
$.with()?你的意思是$.when()? -
$.when()当你只有一个承诺时不需要。如果你修复getData1()来返回一个承诺,那么你可以只做getData1().then(...)`。
标签: javascript jquery promise jquery-deferred