Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.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 jQuery延迟:嵌套方法中的承诺,上次回调太早_Javascript_Jquery_Asynchronous_Promise_Deferred - Fatal编程技术网

Javascript jQuery延迟:嵌套方法中的承诺,上次回调太早

Javascript jQuery延迟:嵌套方法中的承诺,上次回调太早,javascript,jquery,asynchronous,promise,deferred,Javascript,Jquery,Asynchronous,Promise,Deferred,我对延期/承诺有问题。我有一个main函数,它调用两个必须串行执行的函数。第一个包含一组必须首先串行执行的异步web服务调用。但实际上,我的第二个函数是在第一个函数中的每个异步反馈出现之前调用的 我构建了一个小示例来说明我的问题: 以下是代码供参考: 函数优先(){ $('ul')。追加(“第一次启动””; let deferred=$.deferred(); setTimeout(function(){//任何异步函数。 $('ul')。追加('li>第一个结尾的“/li>”; 延迟。解决(

我对延期/承诺有问题。我有一个main函数,它调用两个必须串行执行的函数。第一个包含一组必须首先串行执行的异步web服务调用。但实际上,我的第二个函数是在第一个函数中的每个异步反馈出现之前调用的

我构建了一个小示例来说明我的问题:

以下是代码供参考:

函数优先(){
$('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')。追加(
        • 第三端