Javascript jQuery延迟:嵌套方法中的承诺,上次回调太早
我对延期/承诺有问题。我有一个main函数,它调用两个必须串行执行的函数。第一个包含一组必须首先串行执行的异步web服务调用。但实际上,我的第二个函数是在第一个函数中的每个异步反馈出现之前调用的 我构建了一个小示例来说明我的问题: 以下是代码供参考:Javascript jQuery延迟:嵌套方法中的承诺,上次回调太早,javascript,jquery,asynchronous,promise,deferred,Javascript,Jquery,Asynchronous,Promise,Deferred,我对延期/承诺有问题。我有一个main函数,它调用两个必须串行执行的函数。第一个包含一组必须首先串行执行的异步web服务调用。但实际上,我的第二个函数是在第一个函数中的每个异步反馈出现之前调用的 我构建了一个小示例来说明我的问题: 以下是代码供参考: 函数优先(){ $('ul')。追加(“第一次启动””; let deferred=$.deferred(); setTimeout(function(){//任何异步函数。 $('ul')。追加('li>第一个结尾的“/li>”; 延迟。解决(
函数优先(){
$('ul')。追加(“第一次启动” ”;
let deferred=$.deferred();
setTimeout(function(){//任何异步函数。
$('ul')。追加('li>第一个结尾的“/li>”;
延迟。解决();
}, 2000);
延迟返回。承诺();
}
第二功能(da){
$('ul')。追加(“第二次启动” ”;
let deferred=$.deferred();
$('ul')。追加('li>第二个结束(/li>);
延迟。解决();
延迟返回。承诺();
}
第三职能(da){
$('ul').append('third start'))
let deferred=$.deferred();
setTimeout(函数(){
$('ul')。追加('li>第三个结束(/li>);
延迟。解决();
}, 2000);
延迟返回。承诺();
}
函数组函数1(){
let deferred=$.deferred();
$('ul')。追加(“组1已启动” ”;
var data=“test2”;
$.when(first()).then(function()){
第二(数据);
}).然后(函数(){
第三(“测试2”);
}).然后(函数(){
$('ul')。追加(第1组结束);
延迟。解决();
});
延迟返回。承诺();
}
函数组函数2(){
$('ul')。追加(“ 第2组已启动” ”;
$('ul')。追加(第2组结束);
}
$(函数(){
$.when(GroupFunction1())。然后(GroupFunction2);
})
您需要返回回调函数中的承诺。这是承诺链唯一能伺候他们的方法
此外,您正在滥用显式承诺创建反模式
.then()
返回一个承诺。你可以把它还给我。在$中传递一个承诺是没有意义的。when()
因为所有$。when()
要做的就是把它吐出来:
函数优先(){
$('ul')。追加(“第一次启动” ”;
let deferred=$.deferred();
setTimeout(function(){//任何异步函数。
$('ul')。追加('li>第一个结尾的“/li>”;
延迟。解决();
}, 2000);
延迟返回。承诺();
}
第二功能(da){
$('ul')。追加(“第二次启动” ”;
let deferred=$.deferred();
$('ul')。追加('li>第二个结束(/li>);
延迟。解决();
延迟返回。承诺();
}
第三职能(da){
$('ul').append('third start'))
let deferred=$.deferred();
setTimeout(函数(){
$('ul')。追加('li>第三个结束(/li>);
延迟。解决();
}, 2000);
延迟返回。承诺();
}
函数组函数1(){
let deferred=$.deferred();
$('ul')。追加(“组1已启动” ”;
var data=“test2”;
//v--这里
return first()//v--here
.then(函数(){返回第二个(数据);})
.then(函数(){return third(“test2”);})
.then(function(){$('ul').append(第1组结束) ”;});
}
函数组函数2(){
$('ul')。追加(“第2组已启动” ”;
$('ul')。追加(第2组结束);
}
$(函数(){
GroupFunction1()。然后(GroupFunction2);
})
您需要返回回调函数中的承诺。这是承诺链唯一能伺候他们的方法
此外,您正在滥用显式承诺创建反模式
.then()
返回一个承诺。你可以把它还给我。在$中传递一个承诺是没有意义的。when()
因为所有$。when()
要做的就是把它吐出来:
函数优先(){
$('ul')。追加(“第一次启动” ”;
let deferred=$.deferred();
setTimeout(function(){//任何异步函数。
$('ul')。追加('li>第一个结尾的“/li>”;
延迟。解决();
}, 2000);
延迟返回。承诺();
}
第二功能(da){
$('ul')。追加(“第二次启动” ”;
let deferred=$.deferred();
$('ul')。追加('li>第二个结束(/li>);
延迟。解决();
延迟返回。承诺();
}
第三职能(da){
$('ul').append('third start'))
let deferred=$.deferred();
setTimeout(函数(){
$('ul')。追加('li>第三个结束(/li>);
延迟。解决();
}, 2000);
延迟返回。承诺();
}
函数组函数1(){
let deferred=$.deferred();
$('ul')。追加(“组1已启动” ”;
var data=“test2”;
//v--这里
return first()//v--here
.then(函数(){返回第二个(数据);})
.then(函数(){return third(“test2”);})
.then(function(){$('ul').append(第1组结束) ”;});
}
函数组函数2(){
$('ul')。追加(“第2组已启动” ”;
$('ul')。追加(第2组结束);
}
$(函数(){
GroupFunction1()。然后(GroupFunction2);
})
并不是你问题的答案;JLRishe已经解释了为什么您的代码没有等待您的承诺
这是一个相当大的清理,我已经包括了一个小实用程序,它将setTimeout包装成一个承诺,这样你就不必像往常一样去做,也不必到处重复你自己
功能优先(数据){
$('ul')。追加(“第一次启动” ”;
返回等待(2000)
.然后(函数(){
$('ul')。追加('li>第一个结尾的“/li>”;
});
}
第二功能(数据){
$('ul')。追加(“第二次启动” ”;
$('ul')。追加('li>第二个结束(/li>);
//让我们与API保持一致
//即使我们必须为此做出空洞的/毫无意义的承诺
返回承诺。解决();
}
第三功能(数据){
$('ul')。追加(“第三次启动” ”;
返回等待(2000)
.然后(函数(){
$('ul')。追加(第三端