• 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’
    };
    

      

  • 相关阅读:
    有7g和2g的砝码各一个,怎样称可以3次把140g东西分为50g和90g???????
    中缀到后缀(一个例子)
    动态代理模式的使用
    代理模式用来初始化的延迟下载
    ReentrantLock Condition 实现消费者生产者问题
    Two Sum
    [leetcode]重建二叉树(先序和终须) 中序遍和后续
    (转载)旋转数组查找 最简洁方法 总结
    [不明觉厉] 下一个排列
    codeforces -- 283A
  • 原文地址:https://www.cnblogs.com/alantao/p/8446515.html
Copyright © 2020-2023  润新知