为什么 Promise 不使用 setTimeout 显示数据?

Why Promise is not displaying the data with setTimeout?

我编写了一个函数来在 500 毫秒后获取一个随机数,它与 (return new Promise (resolve,reject)) 完美配合,而且,它在没有它的情况下使用 setTimeout() 函数也能正常工作,但是当我添加里面的 promise 和 setTimeout() 不会显示结果,我在结果前后都有 console.log() 并且都显示了。请注意,我对 promise 概念总体上还是陌生的,因为这是我的编码学校的任务,谢谢。

我的代码:

function getRandomNumber () {
   new Promise ((resolve,reject) =>{
      console.log('Getting Random Number...');
      let number =   Math.random();
      setTimeout( () => {
         if(number){
            resolve (`OK ${number}`);
            console.log('Done!');
         }
         else
            reject ('ERROR');
      }, 500);
   });   
 }
    
getRandomNumber();

结果:

首先,return 你的承诺,其次使用承诺提供的结果,方法是从它创建一个变量并等待它或使用 then

function getRandomNumber() {
    return new Promise((resolve, reject) => {
        console.log('Getting Random Number...');
        let number = Math.random();
        setTimeout(() => {
            if (number) {
                resolve(`OK ${number}`);
                console.log('Done!');
            } else {
                reject('ERROR');
            }
        }, 500);
    });

}

getRandomNumber().then(result => console.log(result));

(async () => {
  const number = await getRandomNumber();
  console.log(number);
 })();

另一种选择是将sleep编写为单独的可重用函数。注意 async 函数可以 await 多个值和 return 个值。调用 async 函数将 总是 return Promise -

function sleep(time) {
  return new Promise(resolve => setTimeout(resolve, time))
}

async function getRandomNumber() {
  console.log('Getting Random Number...')
  await sleep(500)
  const number = Math.random()
  console.log("Done!")
  return number
}

async function main() {
  const number1 = await getRandomNumber()
  console.log("number1", number1)
  const number2 = await getRandomNumber()
  console.log("number1", number2)
  const number3 = await getRandomNumber()
  console.log("number1", number3)
  return number1 + number2 + number3
}

main().then(console.log, console.error)
.as-console-wrapper { min-height: 100%; }

Getting Random Number...
Done!
number1 0.2907058138817884
Getting Random Number...
Done!
number1 0.05784624607512423
Getting Random Number...
Done!
number1 0.889702848981964
1.2382549089388766

您需要 return 承诺,然后您可以在 async 函数中使用 await 来获取结果

function getRandomNumber () {
   return new Promise ((resolve,reject) =>{
      console.log('Getting Random Number...');
      let number =   Math.random();
      setTimeout( () => {
         if(number){
            resolve (`OK ${number}`);
            console.log('Done!');
         }
         else
            reject ('ERROR');
      }, 500);
   });   
 }
    
const printNumber = async () => console.log(await getRandomNumber());
printNumber();