【问题标题】:Javascript promise confusion for executing two functions in orderJavascript承诺按顺序执行两个函数会造成混淆
【发布时间】:2017-12-08 11:12:05
【问题描述】:

现在我有 funcA、funcB、arrayA 和 arrayB。在 funcA 中,arrayB 将通过请求一些外部信息来填充自己,并且执行此操作的时间各不相同。我希望它在arrayB.length == arrayA.length之后执行funcB,而arrayB是一个全局变量,它的内容将在funcB中使用。我假设我需要使用 JQuery deferred 和 promise..所以我尝试了这个

     var arrayB = [];
     var hi = funcA();
     hi.then(funcB());

     funcA(){
            var Dfd = $.Deferred();
            arrayB.forEach(function(x, i){
                   some external retrieval;
                   if (arrayB.length == arrayA.length){
                         Dfd.resolve(arrayB);
                   }
             })

        return Dfd;
     }

但这无济于事。应该怎么改?

【问题讨论】:

  • 检查需要在“一些外部检索”内完成,否则它永远不会解决(因为它只发生一次)
  • @MinusFour 我的错。它在那个函数里面。我刚换了帖子
  • hi.then(funcB()); 调用 funcB 会返回一个函数吗?因为任何 non-function 参数都会被 .then ... 忽略,而您在此 .then 中提供的参数是 调用 funcB 的结果
  • 如果您包含包含异步操作的实际代码,无论是什么,我们都可以为您提供更好的帮助。我们需要知道何时完成以及如何知道这取决于它到底是什么以及它是否已经使用了 Promise。这个问题太理论化,无法得到很好的答案。请向我们展示您正在尝试执行的实际代码,我们可以做出更好的答案。仅供参考,在这里显示实际代码而不是虚构示例总是更好。
  • 可能,您想承诺异步操作,使用Promise.all() 知道它们何时完成,然后返回一个可以通过将函数引用传递给.then() 来使用的承诺,如.then(funcB),不是你拥有它的方式。但是,我们需要看到更多真实的代码,包括异步操作,才能知道如何最好地推荐这个。

标签: javascript jquery promise jquery-deferred deferred-execution


【解决方案1】:

arrayB.forEach 不会做任何事情。它是空的。忘记所有这些功能并延迟。

fetch('/mydata.json')
  .then(function(response) {
    //save your data from response to arrayB
    //call your funcA
  })
  .catch((error) => {
    console.log(error);
});

我不知道你为什么需要那个:

if (arrayB.length == arrayA.length){
   Dfd.resolve(arrayB);
}

但请在调用 funcA 之前随时进行检查。

【讨论】:

    【解决方案2】:

    我通过这样做解决了问题:

      hi.done(function(){funcA()});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多