Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 答应我,一切似乎马上就解决了_Javascript_Jquery_Promise - Fatal编程技术网

Javascript 答应我,一切似乎马上就解决了

Javascript 答应我,一切似乎马上就解决了,javascript,jquery,promise,Javascript,Jquery,Promise,我发布了一篇文章,但我发现其行为与Promise.all的行为相同。请让我知道,如果我违反任何规则,分别提交此 我试图用承诺来保证所有的承诺。我的例子比我的使用简单得多,但它说明了这个问题。在一连串的承诺中,我有一系列的承诺,在链能够继续之前,都需要解决——我所理解的完全是承诺。 不幸的是,当我返回Promise.all对象时,链中的下一个Promise会立即运行,而不会等待传递给all()的承诺 我已经设置了一个js小提琴,以我能想到的最佳方式演示: 请注意,第一个和第二个几乎是在同一时间解析

我发布了一篇文章,但我发现其行为与
Promise.all的行为相同。请让我知道,如果我违反任何规则,分别提交此

我试图用承诺来保证所有的承诺。我的例子比我的使用简单得多,但它说明了这个问题。在一连串的承诺中,我有一系列的承诺,在链能够继续之前,都需要解决——我所理解的完全是承诺。 不幸的是,当我返回Promise.all对象时,链中的下一个Promise会立即运行,而不会等待传递给all()的承诺

我已经设置了一个js小提琴,以我能想到的最佳方式演示:

请注意,第一个和第二个几乎是在同一时间解析的,而第二个应该是在1s承诺返回之后。第三和第四步按预期进行

Fiddle代码如下所示:

function delayAjax(delay) {
    return $.ajax({
        url: '/echo/json/',
        data: {
            json: '',
            delay: delay,
        }
    });
}

delayAjax(1).then(function() {
    $('#first').addClass('red');
    var proms = [delayAjax(1), delayAjax(1)];
    return Promise.all(proms).then(function() {
        $('#onepointfive').addClass('red');
    });
}).then(function() {
    $('#second').addClass('red');
    return delayAjax(1);
}).then(function() {
    $('#third').addClass('red');
    return delayAjax(1);
}).then(function() {
    $('#fourth').addClass('red');
});
HTML

首先
一分五
第二
第三
第四

首先需要将jQuery的延迟转换为承诺

function delayAjax(delay) {
    return Promise.resolve($.ajax({
        url: '/echo/json/',
        data: {
            json: '',
            delay: delay,
        }
    }));
}

中有一节讨论了如何管理不可靠的数据:

它确实给出了
承诺。解决(thenable)
作为实现这一点的方法

我不知道如何解释为什么你会目睹自己的行为,但多梅尼克·丹尼科拉的文章探讨了为什么jQuery的延迟不是真正的承诺,以及为什么它们是有问题的。在文章的最后,他提供了在Q库中处理不可靠承诺的方法,即使用
Q.when()
(Angularjs
$Q
服务还提供了一个
.when()
方法用于相同目的):


可能与jQuery不遵守
Promise.all的返回值有关。删除第一个Ajax调用是有效的:。事实上,我注意到链接all()返回对象会正确等待。事实上,再往前走一步,做出另一个承诺。all()第一个承诺的回报正如我所期望的那样有效:那么问题就变成了,这里使用的承诺之间有什么区别,为什么它们在一起表现得如此接近但不完全正确?嗯,那篇文章确实不是你所能做到的最好的。如果你不得不让它更通用的话,它可能会更合适。如果你需要杀掉其中一个,我建议你杀掉另一个,因为这并不是Ember的RSVP.all所特有的,而是承诺vs jquery延期。我很乐意接受这个答案,因为它在功能上让我达到了我想要的目的。稍微查看一下代码,似乎对列表中的项的检查只是检查它们是否为“thenable”。有人能解释为什么这些看起来是兼容的,但在链接时表现出微妙的不同吗?我明白,这是一个解决办法,因为jQuery的承诺存在一些问题?如果jQuery承诺的行为正确,就不需要它了?我不认为这是正确的。jQuery使用自己的“延迟”对象,它看起来和感觉都很相似,但并不是真正的承诺。事实上,它是可以的,这使它看起来像是可以与承诺结合使用,但显然有一些类似的陷阱。我敢打赌jQuery不认为这是一个bug。它们的物体相互配合很好。我很欣赏对这个主题的深入阅读。出于我的目的,我使用了Ember.RSVP.Promise来做这件事,只是为了保持它的裙带关系。
function delayAjax(delay) {
    return Promise.resolve($.ajax({
        url: '/echo/json/',
        data: {
            json: '',
            delay: delay,
        }
    }));
}
return Q.when($.ajax({
    url: '/echo/json/',
    data: {
        json: '',
        delay: delay,
    }
}));