我需要按顺序(同步)从非异步函数运行异步函数-可以吗?

时间:2019-12-31 01:01:42

标签: javascript typescript async-await

是的,这是一个坏主意,一个可怕的主意。

我正在努力做到这一点:

async function delay(ms: number): Promise<void> {
    await new Promise(r => setTimeout(r, ms));
    console.log('called 3');
}

console.log('called 1');

(async () => {
    console.log('called 2');
    await delay(5000);
    console.log('called 4');
})();

console.log('called 5');

Playground Link

输出:

called 1
called 2
called 3
called 4
called 5

代替此:

called 1
called 2
called 5
called 3
called 4

这有可能吗?

2 个答案:

答案 0 :(得分:0)

我拿出了打字稿标签并直接在浏览器中运行 更改以下行

async function delay(ms: number): Promise<void> {

直接引导

async function delay(ms) {

它可以按您期望的顺序工作……

async function delay(ms) {
    await new Promise(r => setTimeout(r, ms));
    console.log('called 3');
}

console.log('called 1');

(async () => {
    console.log('called 2');
    await delay(5000);
   await console.log('called 4');
   
console.log('called 5');
})();

请记住,异步函数是异步的,因此没有其他方法可以依次调用console.log('called 5');,而无需将其放入异步函数或使用 then 语句。我更喜欢将调用放在异步函数中的更简单方法。

答案 1 :(得分:0)

这不是一个“坏主意”,而是您无法使用所需的语法。但是您可以肯定在console.log('called 5')函数之后执行async;只是您不能使用await(假设您不在async函数中):

async function delay(ms) {
    await new Promise(r => setTimeout(r, ms));
    console.log('called 3');
}

console.log('called 1');

(async () => {
    console.log('called 2');
    await delay(2000);
    console.log('called 4');
})().then(
 ()=> console.log('called 5')
);

别忘了异步函数会返回一个隐式的Promise作为结果;因此您可以使用then获得所需的结果。

这,或者将所有内容包装在async function中,以便可以使用await;但我从您的问题中了解到,这在某种程度上不是一个选择。