JS函数的事件监听器

Event listener for JS function

我们能知道JS函数什么时候完成吗运行。示例:我的函数有很长的过程,我想监视该过程或至少知道它何时完成。

有几种方法可以知道函数何时完成 运行。

同步函数

如果有问题的函数完全同步运行,那么调用该函数的代码将等到它完成后再执行。例如:

function a() {
    // do something
}

function b() {
    a();
    console.log("a is done"); // will only run once a is finished
}

异步函数

Promises in JavaScript 是完成此任务的另一种方法,即使您有异步调用,它们也能工作——例如请求服务器等。首先,您将第一个函数 return 设为一个承诺:

function a() {
    return new Promise((resolve, reject)=>{
        // do something
        resolve(); // once we're done, resolve the promise
    });
}

promise 的构造函数接受一个函数,该函数有两个参数,resolvereject,由 JavaScript 提供给它。处理完可以调用resolve()函数,遇到错误无法解析时调用reject()函数。

要使用它,您可以这样做:

function b() {
    a().then(()=>{
         console.log("a is done"); // will only run once a is finished
    });
}

运行 promise 的好处是所有其他代码都可以继续 运行 - 除了传递给 then 方法的匿名函数外,在 promise 后面没有任何东西被阻塞. 这绝对是我会采用的方法。

监控进度/记录

关于监控功能的进度,这实际上取决于功能的工作方式。最好的办法可能是在长函数到达某些部分时调用某种日志记录函数。例如:

function a() {
    // do something
    console.log("did something");
    // do something else
    console.log("done");
}

如果您出于某种原因无法更改函数 a(),则没有好的方法(据我所知),除非您知道它会更改某些全局变量并且您可以检查对于更改,但这样的方法会很狡猾,绝对不是做事的好方法。

结论

在不知道您想监控的功能/流程是什么的情况下,我真的不能说太多 - 有 special ways 可以检查文件上传进度,例如,我这里没有介绍。

同样,如果该过程发生在不同的服务器或设备上,这些方法将根本不起作用 - 您可能需要查看 WebSockets or (more likely) Server Sent Events 以获取这些任务的进度更新。