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. $_POST和$GLOBALS['HTTP_RAW_POST_DATA'] 的区别

    HTTP 协议是建立在 TCP/IP 协议之上的应用层规范,它把 HTTP 请求分为三个部分:请求行.请求头.消息主体.协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协 ...

  2. 13 ,CSS 入门基础,行内排版内嵌式排版和外部排版样式

    1.认识 CSS 2.传统 HTML 设计网页版面的缺点 3.CSS 的特点 4.CSS 的排版样式 13.1 认识CSS CSS的英文全名是 Cascading Style Sheets,中文可翻译 ...

  3. JS命名空间模式解析

    简介 在SF上看到这样一个提问: 如题,因为不得已的原因,需要写若干个全局函数.但又不想这样: window.a = function(){} window.b = function(){} wind ...

  4. Vue2+VueRouter2+webpack 构建项目实战(五):配置子路由

    前言 通过前面几章的实战,我们已经顺利的构建项目,并且从API接口获取到数据并且渲染出来了.制作更多的页面,更复杂的应用,就是各位自己根据自己的项目去调整的事情了. 本章讲一下如何配置子路由,因为我们 ...

  5. css小知识

    7. span { display:inline-block; width:70px; /* 超出长度以...显示 */ text-overflow: ellipsis; white-space: n ...

  6. 【代码笔记】Web-Javascript-Javascript typeof

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

  7. 无需ORM的数据库

    DynamicDB是一种NoSQL数据库.一个实例下可以创建多种Database,一个Database中可以包含多个Collection(相当于关系型数据库中的Table),一个Collection中 ...

  8. ReactNative编写规范

    <一>  React 代码规范 文件与组件命名 扩展名: 使用.js作为js文件的扩展名.如果同一个文件夹下有同名而不同作用的js文件,则通过中缀(小写)进一步区分,例如:HomePage ...

  9. View体系第二篇:View滑动

    View滑动的基本思想:当点击事件传到View时,系统记下触摸点的坐标,手指移动时系统记下触摸后的坐标并计算出偏移量,然后根据偏移量修正View坐标. 实现View滑动共有6种方法:layout()方 ...

  10. Kotlin 或将取代 Java——《Java 编程思想》作者 Bruce Eckel [转]

    Bruce Eckel 是<Java 编程思想>.<C++编程思想>的作者,同时也是 MindView 公司的总裁,该公司向客户提供软件咨询和培训.他是 C++ 标准委员会拥有 ...