首页 > 解决方案 > 当您无法修改异步函数时,Javascript 控制程序流程

问题描述

因此,我看到的所有关于 Promise 或回调的示例通常都涉及将回调注入到 setTimeout 内部的异步函数中或类似的东西中。但是,如果您有一个无论出于何种原因都无法修改的功能怎么办。也许它是从库中导入的,idk。想象一下这段代码。

const funcA = () => {
    setTimeout(() =>console.log("first"), 500)
            
}

const funcB = () => {
    console.log("second");
}

funcA();
funcB();

在不修改 funcA 的情况下,如何在第一个之后打印第二个?

标签: javascriptasynchronous

解决方案


TLDR:放弃代码。

javascript 中的所有异步函数要么返回一个承诺,要么接受一个回调。自 2000 年代中期以来,这一直是 javascript 的文化。如果您遇到问题中的情况,最好的解决方案是不使用该库并查找其他内容。

解决方法..

但是,有时您需要执行此类操作。例如,如果您开发了一个混搭脚本,用户可以将其插入到他的 HTML 中,并且您无法控制用户如何复制/粘贴您的代码。

一种解决方法是使用setTimeoutsetInterval监视某些内容以进行更改。这可以是变量、a <div>、an<input>等。这是一个等待jQuery加载的愚蠢示例:

const funcB = () => {
    console.log("second");
}

function waitForJQuery () {
    if (window.jQuery || window.$) { // check if jQuery variable exist
        console.log('jQuery loaded');
        funcB();
    }
    else {
        setTimeout(waitForJQuery, 200); // check 5 times per second
    }
}

waitForJQuery();

通常你不会写这样的代码。但是如果并且只有当你别无选择时,你才能做这样的事情。

请注意,尽管这需要您等待产生副作用的任何内容:创建全局变量或修改全局变量或更新 DOM 等。


推荐阅读