使用Typescript Async / Await over Promises有好处吗?

时间:2018-06-22 11:37:25

标签: javascript typescript async-await

此时,使用Proscriptes上的Typescript异步/等待是否有好处?

我有一个用打字稿写的单页应用程序,还没有使用过async / await。

现在是时候转换为使用异步/等待而不是承诺了吗?

我的担忧:

  1. 有速度差吗? TS目前是我的项目中的ES5,与承诺相比,生成的代码显得有些冗长。

  2. Promise.all()呢?有没有办法用打字稿async / await

2 个答案:

答案 0 :(得分:4)

我要说一下async / await的好处(顺便说一句,它不仅具有Typescript还具有javascript功能)是,如果您具有多个承诺的代码段,它可以使代码更清晰。异常处理也将更加无缝。

但是,这并不意味着您必须转换为异步/等待状态。承诺仍将是async / await使用的基础元素,它们不会随处可见。

  • 更好的了解方法是自己对它进行基准测试,但我认为不会有很大的不同。

  • 异步/等待几乎只是包装其他承诺,因此任何会返回Promise的东西都可以使用。这意味着

    Promise.all(promises).then(data => console.log(data));
    

    可以转换为

    const data = await Promise.all(promises);
    console.log(data),
    

答案 1 :(得分:2)

  

与承诺相比,生成的代码显得有些罗word。

“罗word”的结果不应该引起您的关注,并且对表现不佳也没有因果关系。

如果要检查性能问题,请在类似生产的条件下对其进行基准测试。

但是,您应该注意不要让您的源代码过于冗长,请为自己和您的同事清除。

考虑一下:

async function startGame() {
  var currentScore = 5;
  console.log('Game Started! Current score is ' + currentScore);
  currentScore = await levelOne(currentScore);
  console.log('You have reached Level One! New score is ' + currentScore);
  currentScore = await levelTwo(currentScore);
  console.log('You have reached Level Two! New score is ' + currentScore);
  currentScore = await levelThree(currentScore);
  console.log('You have reached Level Three! New score is ' + currentScore);
}

对此:

var startGame = new Promise(function (resolve, reject) {
    var currentScore = 5;
    console.log('Game Started! Current score is ' + currentScore);
    resolve(currentScore);
});
startGame.then(levelOne)
.then(function (result) {
    console.log('You have reached Level One! New score is ' + result);
    return result;
})
.then(levelTwo).then(function (result) {
    console.log('You have reached Level Two! New score is ' + result);
    return result;
})
.then(levelThree).then(function (result) {
    console.log('You have reached Level Three! New score is ' + result);
});

(来自https://dev.to/siwalik/async-programming-basics-every-js-developer-should-know-in-2018-a9c的示例)


如前所述,异步/等待只是Promises的包装。

支持使用async/await的另一个有趣之处是,使用async / await的“同步外观代码”比使用Promises更自然地进行错误处理!


Axnyff的答案已经涵盖了Promise.all的所有要点。