我发现了一些关于jQuery promises的有趣帖子,我自己也在尝试这个功能。我写了下面的代码,但我遇到了一个问题。
var promises = [];
objects.forEach(function(obj) {
promises.push(
$.ajax({
url: 'myurl' + obj.id,
dataType: 'jsonp'
})
)
});
var everything = $.when.apply($,promises).done(function() {..})到目前一切尚好。
在那之后,我认为我可以使用“一切”来理解整个过程何时完成,只需简单地做:
$.when(everything).done( function() { business logic })但这最后一行会立即被解雇,所以有些东西不能正常工作,我不太明白是什么。能帮我一把吗?谢谢
发布于 2013-07-13 00:57:50
问题是.done()不返回新的promise,它只接受一些处理程序并返回相同的promise。jQuery的承诺非常不可靠(参见“关于jQuery的承诺实现的说明”)。在几乎所有其他的promise库中,.done的行为与.then类似,但会返回undefined,并确保错误消息不会被屏蔽。在jQuery中,它就像巧克力消防员一样有用。
有一个充当转换的.then方法(有点像数组的.map。
考虑到这一点,你可以这样做:
var promises = objects.map(function(obj) {
return $.ajax({
url: 'myurl' + obj.id,
dataType: 'jsonp'
});
});
var everything = $.when.apply($, promises).then(function() {..});
$.when(everything).done( function() { business logic });同样值得注意的是,因为everything已经是一个promise,所以$.when(everything)只是一个通过,所以您实际上可以这样写:
everything.done(function () { business logic })关于jQuery的Promise实现的说明
值得注意的是,jQuery的promise实现相当糟糕。它不符合绝大多数其他promise实现所使用的Promises/A+规范。Promises/A+是经过深思熟虑的,是大量努力和实验的结果。jQuery与这一特性的背离通常会使其更难使用。
如果您要使用替代实现(例如Q或我自己的promise),您可以这样做:
Q($.ajax({
url: 'myurl' + obj.id,
dataType: 'jsonp'
}));或
var Promise = require('promise');
Promise.from($.ajax({
url: 'myurl' + obj.id,
dataType: 'jsonp'
}));从jQuery one获得真正的promise /A+promise。
发布于 2013-07-13 03:50:37
$.when(everything)...是完全合法的,但没有必要,因为$.when()是一个"promise组合器“,旨在接受多个promise参数。
由于everything已经是一个由$.when.apply(...).done(...)链返回的promise,所以可能更清楚地将其命名为:
var everything_promise = $.when.apply($, promises).then(function() {..});可以像下面这样调用更多的promise方法:
everything_promise.done(function() {..}).fail(function() {..});根据具体情况,您也可以选择使用.then()。
everything_promise.then(function() {..}, function() {..});关于计时,你的原始$.when(everything)...表单和我的everything_promise.done(...)表单:
如果承诺已解决或被拒绝,
https://stackoverflow.com/questions/17617545
复制相似问题