亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

帶有函數返回的簡單異步等待問題

帶有函數返回的簡單異步等待問題

小怪獸愛吃肉 2022-10-13 17:14:57
我對異步函數有一個簡單但令人困惑的問題。我希望在函數準備好時簡單地返回值。這是一個示例代碼:async function test() {  setTimeout(function() {    return 'eeeee';  }, 5000);}test().then(x => {  console.log(x)});
查看完整描述

3 回答

?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

您將立即獲得未定義的記錄。

很明顯,您正在嘗試編寫一個sleep()異步函數,但請記住 setTimeout 是一個同步函數,使用回調函數調用將在給定時間執行,因此在您執行test()時,調用將運行到結束,return undefined就像您有函數體中沒有 return 語句,它將被傳遞給你的.then()函數。


正確的方法是返回一個在給定時間后解決的 Promise,這將繼續then調用。


async function sleep(time){

  return new Promise((resolve,reject) => {

    setTimeout(() => {

      resolve("echo str")

    },time)

  })

}


sleep(5000).then((echo) => console.log(echo))

簡而言之睡眠功能


const sleep = async time => new Promise(resolve=>setTimout(resolve,time))


查看完整回答
反對 回復 2022-10-13
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

承諾


const setTimer = (duration) => {

      const promise = new Promise((resolve, reject) => {

        setTimeout(() => {

          resolve('Done!');

        }, duration);

      });

      return promise;

    };

    

    setTimer(2000).then((res) => console.log(res));


查看完整回答
反對 回復 2022-10-13
?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

異步函數必須返回一個承諾。所以要解決這個問題,你可以將你的setTimeout函數包裝在一個新的 Promise 中,如下所示:


async function test(){

  return await new Promise((resolve, reject) => {

      setTimeout(function(){

          resolve('eeeee');

      },5000);

  })

}


test().then(x => {

  console.log(x)

});

您可以在此處的 MDN 文檔中了解有關 async/await 的更多信息。希望這可以幫助!



查看完整回答
反對 回復 2022-10-13
  • 3 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號