资讯专栏INFORMATION COLUMN

快速理解和使用 ES7 await/async

Kross / 756人阅读

摘要:是最重要特性之一,它是目前为止最佳的异步解决方案了。虽然没有在中录入,但很快就到来,目前已经在阶段。表示暂停,表示执行下一步,如果你不了解也没关系,可以忽略它直接学习。

await/async 是 ES7 最重要特性之一,它是目前为止 JS 最佳的异步解决方案了。虽然没有在 ES2016 中录入,但很快就到来,目前已经在 ES-Next Stage 4 阶段。

直接上例子,比如我们需要按顺序获取:产品数据=>用户数据=>评论数据

老朋友 Ajax

传统的写法,无需解释

// 获取产品数据
ajax("products.json", (products) => {
    console.log("AJAX/products >>>", JSON.parse(products));

    // 获取用户数据
    ajax("users.json", (users) => {
        console.log("AJAX/users >>>", JSON.parse(users));

        // 获取评论数据
        ajax("products.json", (comments) => {
            console.log("AJAX/comments >>>", JSON.parse(comments));
        });
    });
});
不算新的朋友 Promise

Promise 已经被提及已久了,也是 ES6 的一部分。Promise 能消除 callback hell 带来的厄运金字塔,相比起来代码更清晰了,但还是达不到编写同步代码的直观程度。

// Promise
// 封装 Ajax,返回一个 Promise
function requestP(url) {
    return new Promise(function(resolve, reject) {
        ajax(url, (response) => {
            resolve(JSON.parse(response));
        });
    });
}

// 获取产品数据
requestP("products.json").then((products) => {
    console.log("Promises/products >>>", products);
    // 获取用户数据
    return requestP("users.json");
}).then((users) => {
    console.log("Promises/users >>>", users);
    // 获取评论数据
    return requestP("comments.json");
}).then((comments) => {
    console.log("Promises/comments >>>", comments);
});
强劲的新朋友 Generators

Generators 也是 ES6 一个新的特性,能够 暂停/执行 代码。yield 表示暂停,iterator.next 表示执行下一步,如果你不了解 Generators 也没关系,可以忽略它直接学习 await/async

// Generators
function request(url) {
    ajax(url, (response) => {
        iterator.next(JSON.parse(response));
    });
}

function *main() {
    // 获取产品数据
    let data = yield request("products.json");

    // 获取用户数据
    let users = yield request("users.json");

    // 获取评论数据
    let products = yield request("comments.json");

    console.log("Generator/products >>>", products);
    console.log("Generator/users >>>", users);
    console.log("Generator/comments >>>", comments);
}

var iterator = main();
iterator.next();
碉堡的朋友 await/async

与 Promise 结合使用

// 封装 Ajax,返回一个 Promise
function requestP(url) {
    return new Promise(function(resolve, reject) {
        ajax(url, (response) => {
            resolve(JSON.parse(response));
        });
    });
}

(async () => {
    // 获取产品数据
    let data = await requestP("products.json");

     // 获取用户数据
    let users = await requestP("users.json");

     // 获取评论数据
    let products = await requestP("comments.json");

    console.log("ES7 Async/products >>>", products);
    console.log("ES7 Async/users >>>", users);
    console.log("ES7 Async/comments >>>", comments);
}());

与 Fetch API 结合使用:

(async () => {
// Async/await using the fetch API
    try {

         // 获取产品数据
        let products = await fetch("products.json");

        // Parsing products
        let parsedProducts = await products.json();

        // 获取用户数据
        let users = await fetch("users.json");

        // Parsing users
        let parsedUsers = await users.json();

        // 获取评论数据
        let comments = await fetch("comments.json");

        // Parsing comments
        let parsedComments = await comments.json();


        console.log("ES7 Async+fetch/products >>>", parsedProducts);
        console.log("ES7 Async+fetch/users >>>", parsedUsers);
        console.log("ES7 Async+fetch/comments >>>", parsedComments);


    } catch (error) {
        console.log(error);
    }
}());

再次结合 Fetch

(async () => {
    let parallelDataFetch = await* [
        (await fetch("products.json")).json(),
        (await fetch("users.json")).json(),
        (await fetch("comments.json")).json()
    ];
    console.log("Async parallel+fetch >>>", parallelDataFetch);
}());

使用 await/async 用同步的思维去解决异步的代码,感觉非常酷非常爽!

参考文献[原文]:https://github.com/jaydson/es...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80651.html

相关文章

  • ES6-7

    摘要:的翻译文档由的维护很多人说,阮老师已经有一本关于的书了入门,觉得看看这本书就足够了。前端的异步解决方案之和异步编程模式在前端开发过程中,显得越来越重要。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。 JavaScript Promise 迷你书(中文版) 超详细介绍promise的gitbook,看完再不会promise...... 本书的目的是以目前还在制定中的ECMASc...

    mudiyouyou 评论0 收藏0
  • ES6&ES7中的异步之async函数

    摘要:更好的语义和分别表示异步和等待,比起和更容易理解。前边声明关键字,表示内部有内部操作,调用函数会返回一个对象。等价于其中函数就是自动执行器。 async函数 定义 async函数其实就是之前说过的Generator的语法糖,用于实现异步操作。它是ES2017的新标准。 读取两个文件: const fs = require(fs) const readFile = function(f...

    dongxiawu 评论0 收藏0
  • ES6系列文章 异步神器async-await

    摘要:有两个陌生的关键字,同时函数执行结果似乎返回了一个对象。用来表示函数是异步的,定义的函数会返回一个对象,可以使用方法添加回调函数。如果的是对象会造成异步函数停止执行并且等待的解决如果等的是正常的表达式则立即执行。 视频讲解 关于异步处理,ES5的回调使我们陷入地狱,ES6的Promise使我们脱离魔障,终于、ES7的async-await带我们走向光明。今天就来学习一下 async-a...

    miqt 评论0 收藏0
  • 【译】async/await 应知应会

    摘要:原文地址原文作者翻译作者是在版本中引入的,它对于中的异步编程而言是一个巨大的提升。可能会产生误导一些文章把和进行了比较,同时说它是异步编程演变过程中的下一代解决方案,对此我不敢苟同。结论在中引入的关键字无疑是对异步编程的一大加强。 原文地址: https://hackernoon.com/javasc...原文作者: Charlee Li 翻译作者: Xixi20160512 asy...

    Ku_Andrew 评论0 收藏0

发表评论

0条评论

Kross

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<