async 函数概述

async/await应该是目前最简单的异步方案,ES7 中新增了 async/await 两个关键词。

async 可以声明一个异步函数,此函数需要返回一个 Promise 对象。await 可以等待一个 Promise 对象 resolve,并拿到结果。

其实async函数是对 Generator 函数的改进,同步表达异步操作,真正意义上解决异步回调的问题

语法结构

async function foo() {
await 异步操作;
await 异步操作;
}

async 函数基本用法

async函数返回一个 Promise 对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。

async 表示这是一个async函数,await只能用在这个函数里面。

await 表示在这里等待promise返回结果了,再继续执行。

await 后面跟着的应该是一个promise对象(当然,其他返回值也没关系,只是不会等待结果的返回会立即执行,如果这样的话,async函数就没有意义了)

var sleep = function (time) {
return new Promise(function (resolve, reject) {
console.log('执行');
setTimeout(function () {
resolve();
}, time);
});
}; var start = async function () {
// 在这里使用起来就像同步代码那样直观
console.log('start');
await sleep(3000);
console.log('end');
}; start(); // 执行结果是start 执行 end

得到promise对象的返回值——await等待的虽然是promise对象,但不必写.then(..),直接可以得到返回值

var sleep = function (time) {
return new Promise(function (resolve, reject) {
console.log('执行');
setTimeout(function () {
resolve('ok'); // 返回 ‘ok’
}, time);
});
}; var start = async function () {
// 在这里使用起来就像同步代码那样直观
console.log('start');
let result = await sleep(3000);
console.log(result);
console.log('end');
};
start();

捕捉promise的错误——既然.then(..)不用写了,那么.catch(..)也不用写,可以直接用标准的try catch语法捕捉错误

var sleep = function (time) {
return new Promise(function (resolve, reject) {
console.log('执行');
setTimeout(function () {
reject('出错了'); // 返回错误信息 ‘出错了’
}, time);
});
}; var start = async function () {
// 在这里使用起来就像同步代码那样直观
console.log('start');
await sleep(3000).catch(function (result) {
console.log(result);
});
console.log('end');
};
start();

使用这种catch()的方式,后面的程序还可以继续执行,如果使用下面这种方式的话,被try下面的程序不会继续执行

var sleep = function (time) {
return new Promise(function (resolve, reject) {
console.log('执行');
setTimeout(function () {
reject('出错了'); // 返回错误信息 ‘出错了’
}, time);
});
}; var start = async function () {
try {
console.log('start');
await sleep(3000); // 这里得到了一个返回错误 // 所以以下代码不会被执行了
console.log('end');
} catch (err) {
console.log(err); // 这里捕捉到错误信息 `出错了`
}
};
start();

循环多个await——await看起来就像是同步代码,所以可以理所当然的写在for循环里,不必担心以往需要闭包才能解决的问题 值得注意的是,await必须在async函数的上下文中的

var sleep = function (time) {
return new Promise(function (resolve, reject) {
console.log('执行');
setTimeout(function () {
resolve('ok');
}, time);
});
}; var start = async function () {
try {
console.log('start');
for (var i = 1; i <= 5; i++) {
console.log(`当前是第${i}次等待..`);
console.log(await sleep(1000));
}
console.log('end');
} catch (err) {
console.log(err);
}
};
start();

await只能在async函数中运行——下面依次是错误的代码和正确的代码

var sleep = function (time) {
return new Promise(function (resolve, reject) {
console.log('执行');
setTimeout(function () {
resolve('ok');
}, time);
});
}; var start = async function () {
try {
var arr = [1,2,3,4,5]
console.log('start');
for(var v of arr) {
console.log(`当前是第${v}次等待..`);
console.log(await sleep(1000)); // 正确, for循环的上下文还在async函数中
}
console.log('end');
} catch (err) {
console.log(err);
}
};
start();

async应用——Ajax请求

// 获取新闻内容
async function getNews(url) {
return new Promise((resolve, reject) => {
$.ajax({
method: 'get',
url: url,
success: data => resolve(data),
error: error => reject(error)
})
})
} async function sendXml() {
let data = await getNews('http://xxxxxx')
await getNews('http://xxxxxx?id='+data.id)
}

await代码块最好放在try catch代码块中

// 获取新闻内容
async function getNews(url) {
return new Promise((resolve, reject) => {
$.ajax({
method: 'get',
url: url,
success: data => resolve(data),
error: error => reject(error)
})
})
} async function sendXml() {
try {
let data = await getNews('http://xxxxxx')
await getNews('http://xxxxxx?id='+data.id)
} catch (e) {
console.log(e)
}
}

ES5-ES6-ES7_async函数的更多相关文章

  1. es6的箭头函数和es5的function函数区别

    一.es6的箭头函数es6箭头函数内部没有this,使用时会上朔寻找最近的this不可以做构造函数,不能使用new命令,因为没有this函数体内没有arguments,可以使用rest参数代替不能用y ...

  2. 简述ES5 ES6

    很久前的某一天,一位大神问我,你知道ES6相对于ES5有什么改进吗? 我一脸懵逼的反问,那个啥,啥是ES5.ES6啊. 不得不承认与大神之间的差距,回来深思了这个问题,结合以前的知识,算是有了点眉目. ...

  3. es6箭头函数讲解

    es6箭头函数的用法 箭头函数是es6的一种函数的简写方法. 如下: var f = v = > v; //等同于 var f = function(v){ return v; } var su ...

  4. es6箭头函数 this 指向问题

    es5中 this 的指向 var factory = function(){ this.a = 'a'; this.b = 'b'; this.c = { a:'a+', b:function(){ ...

  5. Atitit js es5 es6新特性 attilax总结

    Atitit js es5 es6新特性 attilax总结 1.1. JavaScript发展时间轴:1 1.2. 以下是ES6排名前十的最佳特性列表(排名不分先后):1 1.3. Es6 支持情况 ...

  6. ES6 箭头函数 this 指向

    ES6 箭头函数 this 指向 箭头函数有几个使用注意点: 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个 ...

  7. 深入理解ES6之函数

    一:关于函数的参数: 可以接受任意数量的参数而无视函数声明的参数数量是js函数的独特之处. 1:参数默认值 ES6之前做法: function makeRequest(url,timeout,call ...

  8. ES6入门——函数的扩展

    1.函数参数的默认值 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法.现在ES6可以为函数的参数添加默认值,简洁了许多. ES5 function show(a,b){ b = b ...

  9. es6之函数扩展与对象扩展

    一.函数扩展 1.参数默认值 参数有默认值,后面不可以再加没有默认值的变量.如以下test函数中,不可以加写成 function test(x,y="word",z){ } fun ...

  10. 【转】React Native中ES5 ES6写法对照

    很多React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component),然而网上搜到的很多教程和例子都是 ...

随机推荐

  1. Office 365平台及其价值主张

    重要提示:<Office 365开发入门指南>视频教程还没有上架,目前会先公开几个小节的文字版本,让大家先睹为快,请大家转发给感兴趣的朋友,敬请留意课程的正式上架和优惠券发放通知. 从今天 ...

  2. Spring Boot 2.0 升级指南

    Spring Boot 2.0 升级指南 前言 Spring Boot已经发布2.0有5个月多,多了很多新特性,一些坑也慢慢被填上,最近有空,就把项目中Spring Boot 版本做了升级,顺便整理下 ...

  3. JavaScript中8个常见的陷阱

    译者按: 漫漫编程路,总有一些坑让你泪流满面. 原文: Who said javascript was easy ? 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原 ...

  4. 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths(tarjan求边双联通分量)

    题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...

  5. 2018-11-04 在线代码离线翻译Chrome插件"一马"v0.0.14

    续前文: 在线代码离线翻译Chrome插件"一马"v0.0.8. 主要改进如下. 项目源码库: program-in-chinese/webextension_github_cod ...

  6. CSS 定位与Z-index

    position: static   Z-index 固定是0 position: absolute/relative/fixed   Z-index 有效 在层叠显示上,所有static定位元素看作 ...

  7. finally知识讲解

    finally语句一定会执行吗,很多人认为一定会,其实未必,只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行.假如在try语句之前执行了return操作 ...

  8. 环信easeui集成:坑总结2018(二)

    环信EaseUI 集成,集成不做描述,看文档即可,下面主要谈一些对easeui的个性化需求修改. 该篇文章将解决的问题: 1.如何发送视频功能 2.未完待续.. ------------------- ...

  9. 浅谈Kotlin(三):类

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 已经学习了前 ...

  10. java 返回某一天的周日和现在这一周的周日

    import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import j ...