簡體   English   中英

像使用 setTimeout 的承諾一樣使用 setTimeout 構建異步不起作用

[英]Building async with setTimeout like a promise with setTimeout doesn't work

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function他們說寫作

async function foo() {
   return 1
}

和寫作一樣

function foo() {
   return Promise.resolve(1)
}

所以這意味着如果我們想將一個 promise '轉換'為一個異步函數,我們必須用return promise_result替換resolve(promise_result)

但是當我嘗試將setTimeoutasync一起使用時,它不起作用:

const test1 = async () => {
    setTimeout(
        () => {
            return 5;
        },
        2000,
    )
}
const test2 = () => new Promise(
    (resolve, reject) => {
        setTimeout(
            () => resolve(25),
            1000
        )
    }
)

const execute = async () => {
    const result = await test1();
    console.log(result); // undefined
}

execute();

如果我在test2上使用await它可以工作,但它在test1不起作用。 這是為什么 ? async/await僅用於處理掛起的承諾而不使用.then還是我可以使用帶有return result async而不是使用帶有resolve Promise

它未定義,因為test1不返回任何內容。 仔細看看你在匿名函數中返回它

const test1 = async () => { // <--- this function returns nothing back. Nothing means "undefined"
    setTimeout(
        () => {       // <---- you return it here back in your anonymous  function witch makes no sense
            return 5;
        },
        2000,
    )
}

這是一個有趣的。 這里的問題是

const test1 = async () => {
    setTimeout(
        () => {
            return 5;
        },
        2000,
    )
}

test1 是一個異步函數,但setTimeout不是。

setTimeout只會安排您傳遞的任何內容並立即返回其 timeoutID。 在這種情況下,您真的需要手動處理 Promise 代碼。

您忘記在test1等待setTimeout 發生的事情是你返回一個承諾的承諾。 第一個承諾被等待,但第二個(包裝在第一個內的不是),而在test2你直接返回一個承諾。

在打字稿中更清楚,其中test1的類型應該是Promise<Promise<number>>test2的類型應該是Promise<number>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM