2015-06-29 176 views
0

我有以下几点:等待函数执行完成

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

时,functionB需要回答,取决于用户的输入。它可能是1秒,但也可能是10秒。所以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()已经回答。谢谢。

+1

您是否考虑过使用functionC()作为functionB()的回调函数() –

+0

@ReyamOki _“回顾一下,functionA的执行需要停止,直到functionB()已经回答。”_“functionA”似乎不会返回任何价值?可以描述“需要停止”吗? ,创建stacksnippets,jsfiddle http://jsfiddle.net来演示? – guest271314

回答

0

您可以更改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); 
} 
+0

函数B应该返回用户输入,而不是var延迟 – ReyamOki

+0

为什么?逻辑是一样的,只是现在所有依赖于B的回调的代码都在C函数中执行,而不是分散在两个函数中。 C的'data'参数将保持相同的值。 –

+0

我不明白在函数B中返回延迟的目的。 (延期)永远不会开火。我也不明白为什么functionC需要一个数据参数,但是你可以在没有参数的情况下在functionA中调用它。 FunctionB应该返回用户输入,以便在函数A中使用它。我只是不知道,如何暂停funtionB的执行,直到输入完成。像deferred.resolve();返回userInput;或者只是返回userInput();不起作用,因为返回的值是未定义的。 – ReyamOki

-1

您可以通过functionC作为参数传递给你的functionB作为提here

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

function functionB(callback) { 
    // does something ... 
    if(callback && typeof(callback) === "function") { 
     callback(); 
    } 
} 
0

把你的例子一个简单的对象,你可以做到以下几点:

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(); 

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

这种情况下不需要jQuery。