Javascript 等待异步函数结束

Javascript 等待异步函数结束,javascript,asynchronous,Javascript,Asynchronous,我有自己的函数A,还有一个上传文件的第三方异步函数B,现在我想在A的执行过程中调用函数B,然后等待B函数结束 我可以检查函数是否由标志var F完成,问题是如果我使用下面的代码,浏览器将进入无休止的循环(可能是因为它在循环中很忙,无法更新F) 我无法将函数A拆分为两个子函数 对不起,我的英语很差,JavaScript总是在一个线程中运行。这意味着,您不能进行繁忙的等待,否则将阻止整个脚本。您应该使用一些异步编程。比如为B函数提供回调,或者让B函数返回承诺 回调方法如下所示: B(function

我有自己的函数A,还有一个上传文件的第三方异步函数B,现在我想在A的执行过程中调用函数B,然后等待B函数结束

我可以检查函数是否由标志var F完成,问题是如果我使用下面的代码,浏览器将进入无休止的循环(可能是因为它在循环中很忙,无法更新F)

我无法将函数A拆分为两个子函数


对不起,我的英语很差,JavaScript总是在一个线程中运行。这意味着,您不能进行繁忙的等待,否则将阻止整个脚本。您应该使用一些异步编程。比如为
B
函数提供回调,或者让
B
函数返回承诺

回调方法如下所示:

B(function(err, result) {
    // some code after B completes
});
函数
B
必须在完成后调用回调

使用承诺时,您的代码如下所示:

B().then(function(result) {
        // result handling
    }, 
    function(err) {
        // error handling
    });

承诺非常方便,但需要使用一些第三方库,因为它们不是
JS
的一部分。事实上,使用承诺可能会有所不同,这取决于库(即
jquery
q
中的承诺)

我无法将函数a拆分为两个子函数为什么不?这就是承诺的用途。如果
B
正确实现,它应该返回一个promise对象,您可以使用该对象设置在
B
中的异步进程完成时调用的处理程序。或者,他们可能在函数中添加了一个参数,以便在
B
完成后调用。然而,如果
B
的实现者一直很懒惰,他们就没有做过类似的事情,你也没有什么真正可以做的。
不是JS的一部分,除非你使用的浏览器使用spidermonkey、v8或chakra javascript引擎,它涵盖了所有现代浏览器和NodeJ,并承诺了回调和技术,但是有了这些技术,我应该把A函数分成两个子函数,问题是A函数太复杂了,如果把它分成两个子函数,我会把很多属性从第一个部分发送到第二个部分,而且在我的例子中,这个划分正好在while循环的中心(示例中没有显示)
B().then(function(result) {
        // result handling
    }, 
    function(err) {
        // error handling
    });