async 与await

一. 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’
};

  

原文地址:https://www.cnblogs.com/alantao/p/8446515.html