是否可以在不使用Promise的情况下从异步函数中的回调返回值?

时间:2019-02-11 23:00:53

标签: javascript typescript

一个非常简单的问题,我知道当我编写这样的异步函数时:

const res = (async () => 'hello')();
console.log(await res);

它应该记录为:“ hello”

但是,可以说我想使异步函数中的结果超时,我必须创建一个新的Promise,以便可以将超时回调包装在其中,如下所示:

const res = (async () => 
   new Promise(resolve => 
     setTimeout(
       () => resolve('hello'), 1000
     )
   )
)();
console.log(await res);

好吧,如果异步已经返回了一个Promise,为什么我需要在一个已经存在Promise的函数中创建一个新的Promise,来做这样简单的事情? 我是否缺少某些东西,或者确实是这样设计的? 如果我可以以一种本机的方式做这样的事情会更好吗?可能吗 例如:

const res = (async () => 
  setTimeout(
    () => resolve('hello'), 1000
  )
)();
console.log(await res);

3 个答案:

答案 0 :(得分:2)

最终,您需要将“回调样式”功能转换为承诺,因此您无法真正兑现该承诺。如果您认为这有点丑陋,我建议您使用或构建一个实用程序函数来为您完成此操作。

此外:除非您在函数中使用await,否则没有充分的理由将其标记为异步。更好:

const res = new Promise(resolve => 
  setTimeout(
    () => resolve('hello'),
    1000
  )
);

console.log(await res);

我认为考虑异步/等待的一种好方法是,它使某些promise-patterns的编写更容易,但是并非所有您可以用一个简单的promise做的事也可以通过async / await完成。异步/等待使通用模式(MUCH)更清晰易懂。

答案 1 :(得分:2)

通常来说,new Promise是用于旧式回调的。理想情况下,您希望尽可能避免使用它们。

因此,在您的示例中,您使用setTimeout,然后解析字符串hello。代替执行此操作,创建延迟函数会更有意义,您可以再次使用该函数,然后只返回"hello"

例如

const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));

async function test() {

  const res = (async () =>  {
    await delay(1000);
    return "hello";
  })();
  
  console.log(await res);
  
}

test();

答案 2 :(得分:1)

  

好吧,如果异步已经返回了一个Promise,为什么我需要在一个已经存在Promise的函数中创建一个新的Promise,来做这样简单的事情?

async函数具有三个功能:

  • 它创造了诺言
  • 承诺通过返回值解决
  • 您可以在其中使用await

这使它成为管理其他返回承诺的函数的绝佳工具,因为它使您可以使用await并编写不使用大量回调的代码。

没有使它成为替换Promise的所有其他用途的通用工具。

您仍然需要一个。


  

例如:

const res = (async () => 
  setTimeout(
    () => resolve('hello'), 1000
  )
)();
console.log(await res);

如果这行得通,那么resolve函数就会冒出来,而return不会是函数解析为的值。

它将失去async函数的优势之一。


JavaScript是一个很大的工具箱。不同的工具适合不同的工作。