一. async 与await (https://segmentfault.com/a/1190000007535316)
1.async 是“异步”的简写,而 await 可以认为是 async wait 的简写。所以应该很好理解 async 用于申明一个 function 是异步的,
而 await 用于等待一个异步方法执行完成。await 只能出现在 async 函数中。
async 函数返回的是一个 Promise 对象
async function testAsync() { return "hello async"; } const result = testAsync(); console.log(result); 输出Promist对象 Promise { 'hello async' }
2.await 在等 async 函数的返回值Promise 对象, 会阻塞后面的代码,等着 Promise 对象 resolve,然后得到 resolve 的值,作为 await 表达式的运算结果。
async 函数调用不会造成阻塞,它内部所有的阻塞都被封装在一个 Promise 对象中异步执行。
/** * 获取图集的URL */ const request = require('superagent') const cheerio = require('cheerio') const fs = require('fs-extra') const path = require('path') let url = "http://www.u-cpc.com/product/list.html"; async function getUrl(){ let linkArr = []; for(let i = 0; i <= 10; i++){ const res = await request.get(url); const $ = cheerio.load(res.text); $(".product_ul li").each(function(i, elem){ const href = $(this).find("img").attr("data-original") const title = $(this).find(".productlist_title").text(); linkArr.push(href) }) } //console.log(linkArr); } getUrl();
3.async/Await应该是目前最简单的异步方案了,首先来看个例子。
这里我们要实现一个暂停功能,输入N毫秒,则停顿N毫秒后才继续往下执行。
1.async 表示这是一个async函数,await只能用在这个函数里面。
2.await 表示在这里等待promise返回结果了,再继续执行。
3.await 后面跟着的应该是一个promise对象(当然,其他返回值也没关系,只是会立即执行,不过那样就没有意义了…)
var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(function () { resolve(); }, time); }) }; var start = async function () { // 在这里使用起来就像同步代码那样直观 console.log('start'); await sleep(3000); console.log('end'); }; start(); 控制台先输出start,稍等3秒后,输出了end。
获得返回值, await等待的虽然是promise对象,但不必写.then(..),直接可以得到返回值。
var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(function () { // 返回 ‘ok’ resolve('ok'); }, time); }) }; var start = async function () { let result = await sleep(3000); console.log(result); // 收到 ‘ok’ };