【问题标题】:Wait for function to finish execution等待函数完成执行
【发布时间】:2015-09-16 04:00:25
【问题描述】:

我有以下:

function functionA() {
    var myVar = functionB();
    functionC(myVar);
}

函数B需要回答的时间,取决于用户输入。可能是1s,也可能是10s。所以 functionC 总是被一个未定义的值调用,因为 functionB() 还没有完成。所以我尝试了这个:

function functionA() {
    var def = $.Deferred();
    var myVar = functionB();
    def.resolve();
    $.when(def).done(function () {
        functionC(myVar);
    });
}

这也不起作用。我在 StackOverflow 上看到了这个:javascript function wait until another function to finish 但它怎么能转移到我的问题上呢? 回顾一下,functionA 的执行需要停止,直到 functionB() 得到响应。谢谢。

【问题讨论】:

  • 你考虑过使用functionC()作为functionB()的回调
  • @ReyamOki “回顾一下,functionA 的执行需要停止,直到 functionB() 得到响应。”“functionA”似乎没有返回任何值?可以形容“需要停下来”吗? ,创建stacksn-ps,jsfiddlejsfiddle.net进行演示?

标签: javascript jquery promise jquery-deferred


【解决方案1】:

将您的示例放在一个简单的对象中,您可以执行以下操作:

var myObject = {
    myProp: null,
    functionA: function () {
        this.functionB();
        var self = this;
        var i = setInterval(function () {
            if (self.myProp) {
                clearInterval(i);
                self.functionC();
            }
        }, 100);
    },
    functionB: function () {
        // ...
        this.myProp = 'user input';
    },
    functionC: function () {
        // ...
    }
};
myObject.functionA();

如果设置了myProp,脚本将每0.1s检查一次。如果是,则清除间隔并调用functionC

在这种情况下不需要 jQuery。

【讨论】:

    【解决方案2】:

    您可以将 functionC 作为参数传递给您的 functionB,如提及 here

    function functionA() {
       var myVar = functionB(callback);
       functionC(myVar);
    }
    
    function functionB(callback) {
       // does something ...
       if(callback && typeof(callback) === "function") {
          callback();
       }
    }
    

    【讨论】:

      【解决方案3】:

      您可以更改 functionB 以返回延迟对象,然后您可以在异步处理程序中解析该对象,如下所示:

      function functionA() {
          var deferred = functionB();
          $.when(deferred).done(functionC);
      }
      
      function functionB() {
          var deferred = $.Deferred();
      
          // do something async here...
          // asyncCallback() { 
          //     deferred.resolveWith(this, dataRetrieved);   
          // }
      
          return deferred;
      }
      
      function functionC(data) {
          console.log(data);
      }
      

      【讨论】:

      • functionB 应该返回用户输入,而不是 var deferred
      • 为什么?逻辑是一样的,只是现在所有依赖于 B 回调的代码都在 C 函数中执行,而不是分散在两个函数中。 C 的 data 参数将保持相同的值。
      • 我不明白在functionB中返回deferred的目的。 $.when(deferred) 永远不会触发。我也不明白为什么 functionC 需要一个数据参数,但是你在没有参数的 functionA 中调用它。 FunctionB 应该返回用户输入,以便在 functionA 中使用它。我只是不知道,如何暂停执行 funtionB 直到输入完成。类似 deferred.resolve();返回用户输入;或者只是返回 userInput();不起作用,因为返回的值是未定义的。
      • $.when(deferred) will never fire 是的,当它通过 resolveWith 从函数 B 调用时。为了帮助您消除困惑,我建议您研究 JavaScript 中的异步模式。
      • 好的,我尝试了你的方法。但看看这个小提琴:jsfiddle.net/4DAfn/261 functionA 中的延迟变量似乎总是可以完成的。因此 functionC 立即被调用。问题出在哪里?
      猜你喜欢
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2016-02-21
      相关资源
      最近更新 更多