ES6学习笔记(四)—— async 函数

await 是 async wait 的简写, 是 generator 函数的语法糖。

async 函数的特点:

  • async 声明一个方法是异步的,await 则等待这个异步方法执行的完成
asyncReadFile = async function () {
  var f1 = await readFile(‘/etc/fstab‘)
  var f2 = await readFile(‘/etc/shells‘)
  console.log(f1.toString())
  console.log(f2.toString())
}
  • await 只能出现在 async 函数中, 用在 async 外或者普通函数内都会报错
function getDay () {
  return new Date().getDay()
}
const today = await getDay ()
// Uncaught SyntaxError: Unexpected identifier
  • async函数返回一个 Promise 对象,如果在函数中 return 一个直接量,async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象
async function getName () {
  return ‘wangxi‘
}
getName()
// Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "wangxi"}
  • async函数内部return语句返回的值,会成为then方法回调函数的参数
async function getName () {
  return ‘wangxi‘
}
getName().then(value => console.log(value))
// wangxi
  • 只要一个await语句后面的 Promise 变为reject,那么整个async函数都会中断执行
async function f() {
  await Promise.reject(‘出错了‘)
  await Promise.resolve(‘hello world‘) // 不会执行
}
f()
// VM259:4 Uncaught (in promise) 出错了 
  • 如果希望前一个异步操作失败但不会影响后面的异步操作继续进行,可以将前面的 await 放在 try...catch 结构里面(如果有多个 await ,则需要将每一个 await 都放在 try...catch 中)
async function f() {
  try {
    await Promise.reject(‘出错了‘)
  } catch(e) {
  }
  return await Promise.resolve(‘hello world‘)
}
f().then(v => console.log(v)) 

或者在 await 后面的 Promise 对象加一个 catch 方法来处理错误

async function f() {
  await Promise.reject(‘出错了‘).catch(e => console.log(e))
  await Promise.reject(‘又出错了‘).catch(e => console.log(e))
  return await Promise.resolve(‘hello world‘)
}
f().then(v => console.log(v))
// 出错了
// 又出错了
// hello world
  • 如果多个异步操作不存在继发关系,则可以使用 Promise.all 同时触发异步操作
async function f () {
  // 先后,先执行 getName() 再执行 getAge()
  const name = await getName()
  const age = await getAge()
  console.log(name, wangxi) // wangxi 25
  // 同时触发
  let [name1, age1] = await Promise.all([getName(), getAge()])
  console.log(name1, age1) // wangxi 25
}
时间: 2024-10-10 13:45:57

ES6学习笔记(四)—— async 函数的相关文章

ES6学习笔记<三> 生成器函数与yield

为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口(Interface),yield则是生成器函数中表示 返回 或 继续 执行的关键字. 弄清楚这两个概念后,先看一个例子: function* fun(val) { yield 1*val; yield 2*val; yield 3*val; yield 4*val; return 5*val; }

ES6学习笔记<四>

default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; val_2 = val_2 || 20; return console.log(val_1 + val_2); } add(); // 30 而现在可以这么做 function add_1(val_1 = 5,val_2 = 10){ return console.log(val_1 + val_

es6学习笔记10--箭头函数

基本用法 ES6允许使用“箭头”(=>)定义函数. var f = v => v; 上面的箭头函数等同于: var f = function(v) { return v; }; 如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分. var f = () => 5; // 等同于 var f = function () { return 5 }; var sum = (num1, num2) => num1 + num2; // 等同于 var sum = funct

十四、Android学习笔记_Android回调函数触发的几种方式 广播 静态对象

一.通过广播方式: 1.比如登录.假如下面这个方法是外界调用的,那么怎样在LoginActivity里面执行登录操作,成功之后在回调listener接口呢?如果是平常的类,可以通过构造函数将监听类对象传入即可.但是在Activity中不能传递监听对象,所以考虑使用广播来实现. public void login(final LoginOnClickListener listener) { Intent intent = new Intent(context, LoginActivity.clas

初探swift语言的学习笔记四(类对象,函数)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! swift扩展了非常多功能和属性,有些也比較奇P.仅仅有慢慢学习,通过经验慢慢总结了. 以下将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // C

es6学习笔记初步总结

es6学习笔记初步总结 1. let.const 和 block 作用域 在ES6以前,var关键字声明变量.无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部).这就是函数变量提升例如: let 关键词声明的变量不具备变量提升(hoisting)特性 let 和 const 声明只在最靠近的一个块中(花括号内)有效 当使用常量 const 声明时,请使用大写变量,如:CAPITAL_CASING const 在声明时必须被赋值 否则报语法错误SyntaxError

NLTK学习笔记(四):自然语言处理的一些算法研究

自然语言处理中算法设计有两大部分:分而治之 和 转化 思想.一个是将大问题简化为小问题,另一个是将问题抽象化,向向已知转化.前者的例子:归并排序:后者的例子:判断相邻元素是否相同(与排序). 这次总结的自然语言中常用的一些基本算法,算是入个门了. 递归 使用递归速度上会受影响,但是便于理解算法深层嵌套对象.而一些函数式编程语言会将尾递归优化为迭代. 如果要计算n个词有多少种组合方式?按照阶乘定义:n! = n*(n-1)*...*1 def func(wordlist): length = le

初探swift语言的学习笔记四-2(对上一节有些遗留进行处理)

在上一节中有些问题还没有弄清,在这里自己写了一下,做了一下验证,并希望能给读者有所帮助. 看例子: 例子中包括 callback函数的声明与使用 函数作为形参进行传递 函数作为返回值 函数支持泛型,当然class也支持. import Foundation typealias Point = (Int, Int) let origin: Point = (0, 0) //初始化函数用 func willDoit(sender : CallBackManager) { println("willD

公益图书馆-学习笔记四

1.复选框及其使用方法: <select class="form-control statusSelect" name="select" onchange="javascript:location.href=this.value;"> //注意: onchange内的javascript函数 <option selected value="/user/index?status=yes">我被选中<

Boost Thread学习笔记四

barrierbarrier类的接口定义如下: 1 class barrier : private boost::noncopyable   // Exposition only 2 { 3 public: 4   // construct/copy/destruct 5   barrier(size_t n); 6   ~barrier(); 7  8   // waiting 9   bool wait();10 }; barrier类为我们提供了这样一种控制线程同步的机制:前n - 1次调