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. 一个smtp发送错误

    错误返回: Error: need EHLO and AUTH first ! 原因:服务器是smtp.exmail.qq.com,邮箱账号是企业新申请的邮箱账号,邮箱密码需要重新修改. 解决办法:修 ...

  2. Entity Framework Code first(转载)

    一.Entity Framework Code first(代码优先)使用过程 1.1Entity Framework 代码优先简介 不得不提Entity Framework Code First这个 ...

  3. [angularjs] angularjs系列笔记(八)事件

    AngularJs有自己的HTML事件 ng-click指令 ng-click指令定义了AngularJs点击事件 当点击按钮的时候,赋值count变量并且给count变量加1,显示出count变量 ...

  4. mysql数据表的基本操作

    好久没梳理下Mysql基础命令了.今天抽空整理了下,虽然很简单...但是还是有必要巩固下基础滴啦 1.创建表:之前需要use database database_name 然后create table ...

  5. Spring使用ajax异步上传文件

    单文件上传 <!-- 创建文件选择框 --> 文件上传 :<input type="file" id="file" name="fi ...

  6. C#设计模式之十七中介者模式(Mediator Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第五个模式,该模式是[中介者模式],英文名称是:Mediator Pattern.还是老套路,先从名字上来看看.“中介者模式”我第一次看到这个名称,我的理解 ...

  7. BZOJ1058: [ZJOI2007]报表统计(set)

    Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 4190  Solved: 1420[Submit][Status][Discuss] Descript ...

  8. 【代码笔记】Web-JavaScript-JavaScript错误

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  9. JavaScript面向对象编程指南(六) 继承

    第6章 继承 6.1 原型链 6.1.1原型链示例 原型链法:Child.prototype=new Parent(); <script> function Shape(){ this.n ...

  10. Python Elasticsearch批量操作客户端

    基于Python实现的Elasticsearch批量操作客户端 by:授客 QQ:1033553122   1. 代码用途 1 2. 测试环境 1 3. 使用方法 1 3.1 配置ES服务器信息 1 ...