[译]await VS return VS return await

栏目: JavaScript · 发布时间: 7年前

内容简介:原文地址:当编写异步函数的时候,上面的函数会等待1秒钟后返回一个promise,然后有50%的机会成功返回

原文地址: await vs return vs return await 作者:Jake Archibald

当编写异步函数的时候, await , return , return await 三者之间有一些区别,从中选取正确的方式是很重要的。 我们从下面这个异步函数开始:

async function waitAndMaybeReject(){
    // 等待1秒钟
    await new Promise(resolve => setTimeout(resolve, 1000));
    // 抛一枚硬币
    const isHeads = Boolean(Math.round(Math.random()));
    if(isHeads) return 'yay';
    throw Error('Boo!');
}
复制代码

上面的函数会等待1秒钟后返回一个promise,然后有50%的机会成功返回 yay 或者抛出一个error。让我们用几种稍微不同的方式使用它。

直接调用

async function foo() {
    try{
        waitAndMaybeReject();
    }catch(e){
        return 'caught';
    }
}
复制代码

在此处,如果调用了 foo ,返回的promise的 状态始终都是resolved,值也永远是undefined,而且没有等待 。 由于我们没有await,或者return waitAndMaybeReject() 的结果,所以我们无法对它做出任何反应。像这样的代码通常是错误的。

Awaiting

async function foo(){
    try{
        await waitAndMaybeReject();
    }catch(e){
        return 'caught';
    }
}
复制代码

在此处,如果调用了 foo ,返回的promise将 始终等待1秒钟,然后结果要么状态为resolved,值为undefined,要么状态为resolved,值为 "caught" 因为我们等待了 waitAndMaybeReject() 的返回值,所以它的rejection会被返回并且被抛出(throw),catch的代码块就会执行。但无论如何,如果 waitAndMaybeReject() 没有报错而是顺利执行,我们依旧无法对它的返回值做任何事情。

Returning

async function foo() {
    try {
        return waitAndMaybeReject();
    }
    catch (e) {
        return 'caught';
    }
}
复制代码

在此处,如果调用了 foo ,返回的promise将 始终等待1秒钟,然后结果要么是状态为resolved,值为 "yaa" ,要么是状态是reject,抛出错误 Error('Boo!') 通过 return waitAndMaybeReject() 这行代码,我们直接传递了它的返回结果,所以我们的catch代码块永远不会执行。

Return-awaiting

如果你想在 try 代码块中得到带有正确返回值的resolved状态,在 catch 中捕获异常,那么正确的选择就是 return await

async function foo() {
    try {
        return await waitAndMaybeReject();
    }
    catch (e) {
        return 'caught';
    }
}
复制代码

在此处,如果调用 foo ,返回的promise将 始终等待1秒钟,然后结果要么是状态为resolved,值为 "yay" ,要么是状态为resolved,值为 "caught" 因为我们等待了 waitAndMaybeReject() 的结果,所以它的异常rejecttion会被返回并且被抛出(throw),catch的代码块就会执行。如果 waitAndMaybeReject() 顺利执行没有报错,就返它的结果。

如果对上面的内容还是觉着困惑,那么将代码拆分成两个步骤来看可能会比较好理解:

async function foo() {
  try {
    // 等待 waitAndMaybeReject() 的结果来解决,
    // 并且将 fullfill 的值赋给 fullfilledValue:
    const fulfilledValue = await waitAndMaybeReject();
    // 如果 waitAndMaybeReject() reject了,
    // 我们的代码就会抛出异常,并且进入 catch 代码块的逻辑。
    // 否则,这里的代码就会继续运行下面的语句:
    return fulfilledValue;
  }
  catch (e) {
    return 'caught';
  }
}
复制代码

Note: 在 try/catch 之外的代码块中执行 return await 是多余的(如前所述,直接 return 即可),甚至 Eslint还专门有规则来检测这种场景 ,但是在 try/catch 代码块之内,Eslint就允许这种操作。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

艾伦•图灵传

艾伦•图灵传

(英)安德鲁·霍奇斯 / 孙天齐 / 湖南科学技术出版社 / 2012-8-1 / 68.00元

《艾伦·图灵传:如谜的解谜者》是图灵诞辰100周年纪念版,印制工艺更为精美。本书是世界共认的最权威的图灵传记。艾伦?图灵是现代人工智能的鼻祖,在24岁时奠定了计算机的理论基础。二战期间,他为盟军破译密码,为结束战争做出巨大贡献。战后,他开创性地提出人工智能的概念,并做了大量的前期工作。因同性恋问题事发,被迫注射激素,后来吃毒苹果而死。作者是一名数学家,也是一名同性恋者。他对图灵的生平有切身的体会,......一起来看看 《艾伦•图灵传》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

html转js在线工具
html转js在线工具

html转js在线工具