【问题标题】:How to force an async function waits until another function finish? [duplicate]如何强制异步函数等到另一个函数完成? [复制]
【发布时间】:2019-03-22 12:52:01
【问题描述】:

这是我的代码:

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}
async function user() {
    await mylibwrapper(async () => {
        await sleep(1110); // take long time to done
        console.log("fn");
    })
    // This out put must be after fn. How?
    console.log("user");
}
async function mylibwrapper(fn) {
    // We can wrap or mock fb before pass to mainlib
    await mainlib(fn);
    // How to wait until fn be called and finished? Then we can return and let the caller continue
    console.log("mylibwrapper");
}
async function mainlib(fn) {
    await sublib(fn);
}
async function sublib(fn) {
    fn();
}
user();

我正在为我的用户包装一个库。如何强制mylibwrapper 等到回调fn 完成后再将结果返回给用户?
输出:

mylibwrapper
user
fn

控制台输出中的预期结果是“user”之前的“fn”。你能帮帮我吗?

条件:我们不能通过用户或库(mainlib,sublib)更改代码。我们只需更改mylibwrapper 中的代码或包装/模拟fn,然后再传递给mainlib

【问题讨论】:

  • 您的代码有什么问题? mainlib 不返回承诺吗?如果是这样,mainlib 是如何工作的?
  • @ChrisBrownie55:我更新了问题。所有async 函数都返回承诺。在这种情况下,我只想控制我的代码 mylibwrapper 以等待 fn 完成,然后再将控制权返回给用户,但我不知道如何。
  • 好的,@y2bd 似乎已经回答了您的问题,但如果您可以等待 fn,您可能不应该有 sublibmylibwrapper

标签: javascript async-await es6-promise


【解决方案1】:

您需要在sublib() 中使用await fn()。如果您想等待它们完成,则需要等待所有承诺。

【讨论】:

  • 我无法更改mainlibsublib 中的代码。我可以更改mylibwrapper 中的代码或包装fn,然后将其传递给mainlib
  • 根据 fn 所做的事情,您可能能够对 await 进行一次调用(存储在变量中),然后将使用的 Promise 传递给 mainlib,就像等待再次等待承诺,结果将立即返回。但是,如果您希望 mainlib 或 sublib 先修改 Promise,或者先做任何其他工作,这将不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2019-11-14
相关资源
最近更新 更多