数据API 案例 开发者 关于
掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

认识Async/Await

受到Zeit团队博文的启发,我们的PayPal团队不久之前将服务器端数据库迁移到了Async/Await上。我想要和你们分享一下我的经验。

首先我们先来了解两个术语:

  • Async函数
  • Await 关键词

们总是将AsyncAwait放在一起说,但是你需要知道的是,它们是两个不同的东西。对于Async函数和Await关键词,你需要了解的是,他们从某种程度上来说当然是有一定关联的,但是在没有Await的情况下,Async函数依然可以使用。

函数会返回一个Promise


当你用async关键词创建一个函数的时候,这个函数永远都会返回一个Promise。当你在async函数内部进行返回的时候,它会用一个Promise包裹你的值。

 // here is an async function

async function getNumber() {

  return 4 // actually returns a Promise

}

// the same function using promises

function getNumber() {

     return Promise.resolve(4)

}

Async函数和它的基于PromiseEquivalent


除了将你的return转换为Promise之外,async函数还有一个特别之处,那就是它是唯一一个让你使用await关键词的地方。

Await让你可以暂停async函数的执行,直到它受到了一个promise的结果。这让你可以写出按照执行顺序显示的async代码。

 // async function to show user data

async function displayUserData() {

    let me = await fetch('/users/me')

    console.log(me)

}

// promise-based equivalent

function displayUserData() {

    return fetch('/users/me').then(function(me) {

        console.log(me)

    })

})

Await允许你在不需要callback的情况下写异步代码。这样做的好处是让你的代码可读性更高。而且await可以与任何promise兼容,而不仅仅是用async函数所创建的promise

Async函数中处理错误


因为async函数也是一个Promise,当你在代码中放入一个async函数的时候,它会被吸收,然后作为rejected Promise被返回。

 // basic error handling with async functions

async function getData(param) {

   if (isBad(param)) {

      throw new Error("this is a bad param")

   }

   // ...

}

// basic promise-based error handling example

function getData(param) {

   if (isBad(param)) {

      return Promise.reject(new Error("this is a bad param"))

   }

   // ...

}

当你使用await调用Promise的时候,你可以用try/catch将其包裹,或是你需要在返回的Promise中添加一个catch handler

 // rely on try/catch around the awaited Promise

async function doSomething() {

    try {

        let data = await getData()

    } catch (err) {

        console.error(err)

    }

}

// add a catch handler

function doSomething() {

    return getData().catch(err => {

        console.error(err)

    })

} 

整合


利用好promise的错误处理属性,以及async函数的简洁语法,能够给你带来一些强大的能力。

在下面这个简单的例子中,你会看到我是如何利用async函数内在的错误处理能力的,它让我简化了Express应用中的错误处理流程。

 // catch any errors in the promise and either forward them to next(err) or ignore them

const catchErrors = fn => (req, res, next) => fn(req, res, next).catch(next)

const ignoreErrors = fn => (req, res, next) => fn(req, res, next).catch(() => next())

// wrap my routes in those helpers functions to get error handling

app.get('/sendMoney/:amount', catchErrors(sendMoney))

// use our ignoreErrors helper to ignore any errors in the logging middleware

app.get('/doSomethingElse', ignoreErrors(logSomething), doSomethingElse)

// controller method can throw errors knowing router will pick it up

export async function sendMoney(req, res, next) {

  if (!req.param.amount) {

     throw new Error('You need to provide an amount!')  

  }

  await Money.sendPayment(amount) // no try/catch needed

  res.send(`You just sent ${amount}`)

}

// basic async logging middleware

export async function logSomething(req, res, next) {

    // ...

    throw new Error('Something went wrong with your logging')

    // ...

}

此前,我们一直都在用next(err)来处理错误。然而,有了async/await,我们可以将错误放在代码中的任何位置,然后router会将这些错误throwExpress提供的next函数中,这样就极大的简化了错误处理流程。

我用了几个小时的时间对数据库进行了迁移。要想使用这个方式,你唯一需要的,就是对Promise的深刻理解,以及学会如何设置babel


原文来自:SDK.cn

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务
认识Async/Await
发布:2016-09-08

受到Zeit团队博文的启发,我们的PayPal团队不久之前将服务器端数据库迁移到了Async/Await上。我想要和你们分享一下我的经验。

首先我们先来了解两个术语:

  • Async函数
  • Await 关键词

们总是将AsyncAwait放在一起说,但是你需要知道的是,它们是两个不同的东西。对于Async函数和Await关键词,你需要了解的是,他们从某种程度上来说当然是有一定关联的,但是在没有Await的情况下,Async函数依然可以使用。

函数会返回一个Promise


当你用async关键词创建一个函数的时候,这个函数永远都会返回一个Promise。当你在async函数内部进行返回的时候,它会用一个Promise包裹你的值。

 // here is an async function

async function getNumber() {

  return 4 // actually returns a Promise

}

// the same function using promises

function getNumber() {

     return Promise.resolve(4)

}

Async函数和它的基于PromiseEquivalent


除了将你的return转换为Promise之外,async函数还有一个特别之处,那就是它是唯一一个让你使用await关键词的地方。

Await让你可以暂停async函数的执行,直到它受到了一个promise的结果。这让你可以写出按照执行顺序显示的async代码。

 // async function to show user data

async function displayUserData() {

    let me = await fetch('/users/me')

    console.log(me)

}

// promise-based equivalent

function displayUserData() {

    return fetch('/users/me').then(function(me) {

        console.log(me)

    })

})

Await允许你在不需要callback的情况下写异步代码。这样做的好处是让你的代码可读性更高。而且await可以与任何promise兼容,而不仅仅是用async函数所创建的promise

Async函数中处理错误


因为async函数也是一个Promise,当你在代码中放入一个async函数的时候,它会被吸收,然后作为rejected Promise被返回。

 // basic error handling with async functions

async function getData(param) {

   if (isBad(param)) {

      throw new Error("this is a bad param")

   }

   // ...

}

// basic promise-based error handling example

function getData(param) {

   if (isBad(param)) {

      return Promise.reject(new Error("this is a bad param"))

   }

   // ...

}

当你使用await调用Promise的时候,你可以用try/catch将其包裹,或是你需要在返回的Promise中添加一个catch handler

 // rely on try/catch around the awaited Promise

async function doSomething() {

    try {

        let data = await getData()

    } catch (err) {

        console.error(err)

    }

}

// add a catch handler

function doSomething() {

    return getData().catch(err => {

        console.error(err)

    })

} 

整合


利用好promise的错误处理属性,以及async函数的简洁语法,能够给你带来一些强大的能力。

在下面这个简单的例子中,你会看到我是如何利用async函数内在的错误处理能力的,它让我简化了Express应用中的错误处理流程。

 // catch any errors in the promise and either forward them to next(err) or ignore them

const catchErrors = fn => (req, res, next) => fn(req, res, next).catch(next)

const ignoreErrors = fn => (req, res, next) => fn(req, res, next).catch(() => next())

// wrap my routes in those helpers functions to get error handling

app.get('/sendMoney/:amount', catchErrors(sendMoney))

// use our ignoreErrors helper to ignore any errors in the logging middleware

app.get('/doSomethingElse', ignoreErrors(logSomething), doSomethingElse)

// controller method can throw errors knowing router will pick it up

export async function sendMoney(req, res, next) {

  if (!req.param.amount) {

     throw new Error('You need to provide an amount!')  

  }

  await Money.sendPayment(amount) // no try/catch needed

  res.send(`You just sent ${amount}`)

}

// basic async logging middleware

export async function logSomething(req, res, next) {

    // ...

    throw new Error('Something went wrong with your logging')

    // ...

}

此前,我们一直都在用next(err)来处理错误。然而,有了async/await,我们可以将错误放在代码中的任何位置,然后router会将这些错误throwExpress提供的next函数中,这样就极大的简化了错误处理流程。

我用了几个小时的时间对数据库进行了迁移。要想使用这个方式,你唯一需要的,就是对Promise的深刻理解,以及学会如何设置babel


原文来自:SDK.cn

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

选择想要的接口, 看看能免费获取多少次调用 选择(单选)或填写想要的接口
  • 短信API服务
  • 银行卡四元素检测[简]
  • 身份证实名认证
  • 手机状态查询
  • 三网手机实名制认证[简]
  • 身份证OCR识别
  • 风险信息查询
  • 企业工商信息
短信API服务
  • 短信API服务
  • 银行卡四元素检测[简]
  • 身份证实名认证
  • 手机状态查询
  • 三网手机实名制认证[简]
  • 身份证OCR识别
  • 风险信息查询
  • 企业工商信息
  • 确定
选择您的身份
请选择寻找接口的目的
预计每月调用量
请选择预计每月调用量
产品研发的阶段
请选择产品研发的阶段
×

前往领取
×
企业用户认证,
可获得1000次免费调用
注册登录 > 企业账户认证 > 领取接口包
企业用户认证领取接口包 立即领取
× 企业用户认证,
可获得1000次免费调用,立即领取>
数 据 驱 动 未 来
Data Drives The Future