首页 > 解决方案 > JS:从异步函数提前触发返回的承诺

问题描述

我创建了一些包含 Promises 的函数并尝试将它们链接起来。一切都按预期工作

function foo1() {
     return new Promise((resolve, reject) => {
         setTimeout(() => {
           console.log("11111") 
           resolve()
         }, 4000);
     }).then(() => {
          console.log("222222")
     })
}

function foo2() {
     new Promise(resolve => {
           setTimeout(() => {
               console.log("3333")
               resolve()
           }, 3000)
     })
}

foo1().then(() => foo2())

// "1111"
// "2222"
// "3333"

如果我将相同的东西放在异步/等待中,它也会按预期工作:


async function testAsync() {
    let one   = await foo1();
    let two   = await foo2();
}

// "1111"
// "2222"
// "3333"

我知道异步函数会返回一个 Promise,所以我尝试了以下方法:

testAsync().then(() => {
     console.log("FINISHED");
})

但结果是:

// "1111"
// "2222"
// "FINISHED"
// "3333"

为什么会"FINISHED"提前执行"3333"

标签: javascript

解决方案


你的foo2函数不返回 Promise,只返回 undefined。

这就是为什么您在“3333”之前看到“FINISHED”的原因

如果foo2如下所示,它将按您的意愿工作。

function foo2() {
    return new Promise(resolve => {
        setTimeout(() => {
            console.log("3333")
            resolve()
        }, 3000)
    })
}

推荐阅读