使用外部等待类暂停javascript函数的执行
我试图弄清楚如何在调用另一个函数之前暂停函数的执行,同时使我的javascript代码具有极高的可读性。下面是我正在尝试做的一个例子:使用外部等待类暂停javascript函数的执行,javascript,multithreading,wait,Javascript,Multithreading,Wait,我试图弄清楚如何在调用另一个函数之前暂停函数的执行,同时使我的javascript代码具有极高的可读性。下面是我正在尝试做的一个例子: function main_function(){ function a(); // wait for function a to finish - could take 1 second - could take 3 seconds function b(); // wait for function b to finish -
function main_function(){
function a();
// wait for function a to finish - could take 1 second - could take 3 seconds
function b();
// wait for function b to finish - don't know how long this will take
function c();
// completed
}
我已经阅读了几十篇关于如何使用setTimeOut、重定向到其他函数、回调等的文章,但是找不到一个真正有效的解决方案(其中大多数只是使用一个笨重的setTimeOut(),这真的没有帮助,因为我不知道每个函数可能需要多长时间)
因此,我最终发现了一个名为“WaitThread.js”的小实用程序。这似乎正是我需要做的,而且似乎以后它会很容易阅读和维护
但是,我不知道如何使用它!:)
有人能给我举一个如何使用这个WaitThread.js的例子吗?或者至少为我提供一种可读/优雅的方式,在等待javascript函数一个接一个执行的同时,等待每个函数先完成
这里是指向WaitThread.js页面的链接:
谢谢 根据waitthread.js的解释,它只是使用一个计时器进行轮询,等待某个变量值的变化 这类问题的更典型的设计模式使用回调,并且
函数a
在完成工作时将调用回调,这将启动函数b
。因此,您将一个函数传递给函数a
,当函数a
完成其工作时,应该调用该函数。更完整的设计模式通常对成功退出和不成功退出都有回调,甚至可能从退出传递参数,但因为我不知道您的具体情况,所以我没有尝试在这里建模。对于一个多步骤的过程,它看起来是这样的。我们假设有三个异步函数作为函数a、b和c存在,每个函数都以一个函数作为参数,该参数将在异步函数完成时被调用:
function main_function_step1() {
a(main_function_step2);
}
function main_function_step2() {
// execute code here that goes after function a, but before function b
b(main_function_step3);
}
function main_function_step3() {
// execute code here that goes after function b, but before function c
c(main_function_finish);
}
function main_function_finish()
{
// execute whatever code here to finish
}
更完整的解决方案将通过一个成功回调和一个失败回调传递一个对象,并将至少为每个函数提供一个参数,以便返回结果或错误条件
在这种情况下,它将如下所示:
function main_function_step1() {
function main_function_a_step1_fail(err)
{
// handle error in step 1
}
var o = {success: main_function_step2, fail: main_function_a_step1_fail};
a(o);
}
function main_function_step2(data) {
// execute code here that goes after function a, but before function b
function main_function_a_step2_fail(err)
{
// handle error in step 2
}
var o = {success: main_function_step3, fail: main_function_a_step2_fail};
b(o);
}
function main_function_step3(data) {
// execute code here that goes after function b, but before function c
function main_function_a_step3_fail(err)
{
// handle error in step 3
}
var o = {success: main_function_finish, fail: main_function_a_step3_fail};
c(o);
}
function main_function_finish(data)
{
// execute whatever code here to finish
}
这对代码来说有点混乱,但它不需要轮询或全局变量。如果步骤之间没有要执行的代码,并且它们之间的逻辑都是相同的,那么您可以参数化数据结构中的所有内容,并使用一个函数执行所有步骤,该函数只执行数据结构中的一项,并将下一个值作为回调传递,依此类推。该解决方案真的不是什么神奇的东西。它所做的只是用一个看门狗定时器轮询某个条件的变化。在web浏览器中,JavaScript代码没有“等待”这样的事情。解决这个问题的唯一方法是采用异步编程模型。此外,如果您更详细地了解这些函数的作用,以及是什么使它们花费了很长时间,那么它将有助于提供一些解释和建议。jfriend00-感谢您的反馈!这看起来不错。然而,它看起来仍然有点凌乱(正如你在评论中提到的)。你能给我提供一个如何使用WaitThread.js文件的例子吗?这样我就可以看到它是如何工作的,然后可能在以后我可以修改它,以符合你在这里展示的模型。谢谢Pointy—该函数所做的是调用一个java应用程序来扫描ID卡。在这个过程中,脚本需要等待。完成后(即,当图像文件实际存在时),它会在java小程序周围使用另一个javascript包装器,将图像上传到服务器。完成后,它将解析扫描的许可证中的数据。我非常熟悉PHP和C。然而,javascript(我应该说是高级javascript)对我来说有点陌生。我花了一点时间才意识到我不能调用一个脚本并等待它完成,然后调用我的下一个脚本。如果我调用ajax调用(即调用PHP文件进行处理),我可以这样做。但是,当我只调用内部javascript函数(一个对另一个)时,我无法这样做。对不起,但我不知道waitThread图书馆。我可能会开始使用YUI3 AsyncQueue:我自己,使这类代码更具可读性/可维护性。