支持 async/await

在正式支持 async/await 之前,云函数(不管是否是 async 函数)通过 callback 函数来将执行结果返回给调用方。而现在 async 函数可以直接使用 return 将结果返回。

使用 async + return 时,不要同时使用 callback(除非你对 Node JS 事件循环与 async/await 十分了解),否则可能产生非预期的结果。

非 async 函数无法使用 return。

云函数执行与结果返回机制,请参考Node.js 事件循环

云函数支持以下两种风格的写法:

  • 使用 callback
  1. exports.main = function getProduct(event, callback) {
  2. let tableName = 'product'
  3. let recordID = '59897882ff650c0477f00485'
  4. let Product = new BaaS.TableObject(tableName)
  5. Product.get(recordID).then(product => {
  6. callback(null, product)
  7. }).catch(err => {
  8. callback(err)
  9. })
  10. }
  1. exports.main = async function getProduct(event, callback) {
  2. try {
  3. let tableName = 'product'
  4. let recordID = '59897882ff650c0477f00485'
  5. let Product = new BaaS.TableObject(tableName)
  6. let product = await Product.get(recordID)
  7. callback(null, product)
  8. } catch (err) {
  9. callback(err)
  10. }
  11. }
  • 使用 async + return
  1. exports.main = async function getProduct(event) {
  2. let tableName = 'product'
  3. let recordID = '59897882ff650c0477f00485'
  4. let Product = new BaaS.TableObject(tableName)
  5. return await Product.get(recordID)
  6. }

返回错误信息

使用 async + return 风格,云函数返回错误信息的方式与 callback 风格有所不同,区别如下:

  • callback 风格
  1. exports.main = function (event, callback) {
  2. callback(new Error('error')) // or callback('error')
  3. }

返回值:

  1. {
  2. error: {
  3. message: 'error',
  4. stack: '...',
  5. },
  6. code: 1,
  7. data: null,
  8. }
  • async + return 风格
  1. exports.main = async function (event) {
  2. throw new Error('error')
  3. }

返回值:

  1. {
  2. error: {
  3. message: 'error',
  4. stack: '...',
  5. },
  6. code: 1,
  7. data: null,
  8. }

async 函数中单独写 return 或 return undefined,将会被忽略。例如:

  1. // 该云函数会执行超时
  2. exports.main = async function (event) {
  3. return
  4. }
  1. // 该云函数会执行超时
  2. exports.main = async function (event) {
  3. return undefined
  4. }
  1. // 该云函数会执行并返回 {error: {}, code: 0, data: null}
  2. exports.main = async function (event) {
  3. return null
  4. }