Javascript Jquery延迟未到达最后一个。然后
我有一系列必须执行的功能。除了最后一个,它们都按顺序执行。d1执行,d2执行,d3执行,然后在解析d4之前执行done函数中的代码。不知道为什么。任何帮助都将不胜感激Javascript Jquery延迟未到达最后一个。然后,javascript,jquery,promise,deferred,Javascript,Jquery,Promise,Deferred,我有一系列必须执行的功能。除了最后一个,它们都按顺序执行。d1执行,d2执行,d3执行,然后在解析d4之前执行done函数中的代码。不知道为什么。任何帮助都将不胜感激 $(document).ready(function() { var d1 = functiond1(); var d2 = functiond2(); var d3 = functiond3(); var d4 = functiond4(); d1.then(d2).then(d3).t
$(document).ready(function() {
var d1 = functiond1();
var d2 = functiond2();
var d3 = functiond3();
var d4 = functiond4();
d1.then(d2).then(d3).then(d4).done(function() {
//Code here does not wait for d4 to end before executing
//HELP!
});
});
function functiond1() {
var dfd = $.Deferred();
//Do stuff here
//Works in sequence
dfd.resolve();
return dfd.promise();
}
function functiond2() {
var dfd = $.Deferred();
params = jQuery.param({
'parm1': 1,
'parm2': 2,
'parm3': 3
});
jQuery.getJSON($.webMethoJSONGet1, params).done(function(data) {
//Do stuff here
//Works in sequence
dfd.resolve();
});
return dfd.promise();
}
function functiond3() {
var dfd = $.Deferred();
//Do stuff here
//Works in sequence
dfd.resolve();
return dfd.promise();
}
function functiond4() {
var dfd = $.Deferred();
params = jQuery.param({
'parm1': 1,
'parm2': 2,
'parm3': 3
});
jQuery.getJSON($.webMethoJSONGet2, params).done(function(data) {
//Do stuff here
//does not work in sequence
dfd.resolve();
});
return dfd.promise();
}
我在一个项目中也遇到了同样的问题,这个带有阵列的解决方案运行良好:
$(文档).ready(函数(){
var-pr=[];
var d1=functiond1();
var d2=functiond2();
变量d3=函数d3();
var d4=functiond4();
函数functiond1(){
var dfd=$.Deferred();
pr.push(dfd);
setTimeout(函数(){
$('body').append('1已解析
');
解析();
}, 2000);
}
函数functiond2(){
var dfd=$.Deferred();
pr.push(dfd);
params=jQuery.param({
“parm1”:1,
“parm2”:2,
“parm3”:3
});
setTimeout(函数(){
$('body').append('2已解析
');
解析();
}, 3000);
}
函数functiond3(){
var dfd=$.Deferred();
pr.push(dfd);
setTimeout(函数(){
$('body').append('3已解析
');
解析();
}, 1000);
}
函数functiond4(){
var dfd=$.Deferred();
pr.push(dfd);
params=jQuery.param({
“parm1”:1,
“parm2”:2,
“parm3”:3
});
setTimeout(函数(){
$('body').append('4已解析
');
解析();
}, 50);
}
$.when.apply($,pr).then(function(){
//做点什么
$('body').append('proceducewithcode execution');
});
});代码>
很难说你想用这些承诺做些什么。首先调用所有4个函数,然后尝试用一堆然后回调链接它们。如果要按顺序将它们链接在一起,应如下所示:
functiond1()
.then(functiond2)
.then(functiond3)
.then(functiond4)
.done(function() { /* blah */ });
如果您只想在所有操作完成后获得结果,可以使用$。当
$.when(functiond1(), functiond2(), functiond3(), functiond4())
.then(function(resultd1, resultd2, resultd3, resultd4) { /* blah */ });
另一方面,在函数中创建的承诺是在另一个不必要的承诺的done
回调中解析的。$.getJSON.done()
调用本身返回一个承诺,因此不需要额外的承诺。只需返回从done()
返回的承诺即可
很抱歉,我没有对jQuery延迟对象进行太多的处理,但是它们看起来与标准承诺非常相似。要按顺序运行函数,需要传递对链中函数的引用。然后是链,而不是调用这些函数的结果
e、 g
问题的最终原因是,直接调用d4
将导致其已解决的承诺立即传递到.done
,而不考虑链早期部分的状态。然后
链
您也不应该用额外的承诺来包装JSON函数,因为$.getJSON
已经返回了一个承诺,如果AJAX查询失败,该承诺将被拒绝:
function functiond4() {
...
return $.getJSON(...);
}
当请求帮助时,请将代码缩进可读。我已经通过jsbeautifier为您运行了代码。很好的提示。按要求做。关于代码有什么提示吗?为什么到目前为止所有代码都缩进了?我已经帮你修好了,现在右边的部分比需要的多。我已经修复了它。延迟链进入$(document).ready()中。这是最后一次修理了。不,你没有。您的getJson.done()
返回一个承诺,并且应该是函数返回的内容。在其中嵌套另一个承诺完全违背了使用承诺的目的。谢谢你的回答。我正在验证。不客气,请共享您的代码,以防它不起作用。注意:此代码将使所有四个函数同时运行,并行执行它们的异步操作,并且只有在它们全部完成后才进行解析。因此,确实如此-我误解了这一点。这实际上是他的问题,then@Alnitak使用此代码,您可以完全实现ricardo想要的功能:->独立运行所有函数->在承诺集合中注册它们->一旦所有承诺都得到解决,继续执行一些逻辑否,这是错误的-您必须将函数引用传递给。然后
,不是调用该函数的结果immediately@Alnitak我修正了延迟调用内部的函数,然后
。谢谢。是的,我正在调用函数,每个函数都返回一个承诺,在前一个问题解决之前不应继续到下一个问题,但最后一个问题不会等到解决。谢谢回答。不要注意函数名。在我发布问题之前,我将它们从原件中更改,以强调功能顺序。相信那些不是我用的名字。
function functiond4() {
...
return $.getJSON(...);
}