首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jQuery promises

使用jQuery promises
EN

Stack Overflow用户
提问于 2013-07-12 22:40:21
回答 2查看 1.8K关注 0票数 1

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

代码语言:javascript
复制
    var promises = [];
    objects.forEach(function(obj) {
        promises.push(
            $.ajax({
                url: 'myurl' + obj.id,
                dataType: 'jsonp'
            })
        )
    });

var everything = $.when.apply($,promises).done(function() {..})

到目前一切尚好。

在那之后,我认为我可以使用“一切”来理解整个过程何时完成,只需简单地做:

代码语言:javascript
复制
$.when(everything).done( function() { business logic })

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

EN

回答 2

Stack Overflow用户

发布于 2013-07-13 00:57:50

问题是.done()不返回新的promise,它只接受一些处理程序并返回相同的promise。jQuery的承诺非常不可靠(参见“关于jQuery的承诺实现的说明”)。在几乎所有其他的promise库中,.done的行为与.then类似,但会返回undefined,并确保错误消息不会被屏蔽。在jQuery中,它就像巧克力消防员一样有用。

有一个充当转换的.then方法(有点像数组的.map

考虑到这一点,你可以这样做:

代码语言:javascript
复制
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)只是一个通过,所以您实际上可以这样写:

代码语言:javascript
复制
everything.done(function () { business logic })

关于jQuery的Promise实现的说明

值得注意的是,jQuery的promise实现相当糟糕。它不符合绝大多数其他promise实现所使用的Promises/A+规范。Promises/A+是经过深思熟虑的,是大量努力和实验的结果。jQuery与这一特性的背离通常会使其更难使用。

如果您要使用替代实现(例如Q或我自己的promise),您可以这样做:

代码语言:javascript
复制
Q($.ajax({
    url: 'myurl' + obj.id,
    dataType: 'jsonp'
}));

代码语言:javascript
复制
var Promise = require('promise');
Promise.from($.ajax({
    url: 'myurl' + obj.id,
    dataType: 'jsonp'
}));

从jQuery one获得真正的promise /A+promise。

票数 3
EN

Stack Overflow用户

发布于 2013-07-13 03:50:37

$.when(everything)...是完全合法的,但没有必要,因为$.when()是一个"promise组合器“,旨在接受多个promise参数。

由于everything已经是一个由$.when.apply(...).done(...)链返回的promise,所以可能更清楚地将其命名为:

代码语言:javascript
复制
var everything_promise = $.when.apply($, promises).then(function() {..});

可以像下面这样调用更多的promise方法:

代码语言:javascript
复制
everything_promise.done(function() {..}).fail(function() {..});

根据具体情况,您也可以选择使用.then()

代码语言:javascript
复制
everything_promise.then(function() {..}, function() {..});

关于计时,你的原始$.when(everything)...表单和我的everything_promise.done(...)表单:

如果承诺已解决或被拒绝,

  • 将立即触发
  • 可能会在将来承诺被解决或被拒绝时触发
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17617545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档