1

我发现了一些关于 jQuery Promise 的有趣帖子,我自己也在尝试这个功能。我编写了以下代码,但遇到了问题。

    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 })

但是最后一行会立即被解雇,所以有些东西不能正常工作,我不太明白是什么。你能帮我一把吗?谢谢

4

2 回答 2

3

问题是它.done()不会返回一个新的承诺,它只是接受一些处理程序并返回相同的承诺。jQuery 的 Promise 被严重破坏(参见“关于 jQuery 的 Promise 实现的注释”)。在几乎所有其他 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已经是一个承诺,$.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 中获得真正的 Promises/A+ 承诺。

于 2013-07-12T16:57:49.750 回答
1

$.when(everything)...完全合法但没有必要,就像$.when()“promise combiner”一样,旨在接受多个promise参数。

正如everything已经是一个由$.when.apply(...).done(...)链返回的承诺,它可能更清楚地命名它如下:

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(...)表格:

  • 如果承诺已经解决或被拒绝,将立即触发
  • 当承诺被解决或被拒绝时,可能会在未来的某个时候触发
于 2013-07-12T19:50:37.047 回答