zoukankan      html  css  js  c++  java
  • [ES7] Await multi promises sequentially or concurrently

    Somtime 'async await' can have a bad effect on code proferemence. Let's take a look the below example:

    const fetch = require('node-fetch');
    const BASE_URL = 'https://api.github.com/users';
    
    class GithubUser {
        async fetchGitHubUser(handle) {
            const response = await fetch(`${BASE_URL}/${handle}`);
            const body =  await response.json();
    
            if (response.status !== 200) {
                throw Error(body.message);
            }
    
            return body;
        }
    
        async fetchGitHubRepos(handle) {
            const response = await fetch(`${BASE_URL}/${handle}/repos`);
            const body = await response.json();
    
            if (response.status !== 200) {
                throw Error(body.message);
            }
    
            return body;
        }
    }
    
    (async () => {
        const github = new GithubUser();
    
        try {
            const user = await github.fetchGitHubUser('zhentian-wan');
            const repos = await github.fetchGitHubRepos('zhentian-wan');
            console.log(user);
            console.log(repos);
        } catch(err) {
            console.error(err);
        }
    
    
    })();

    In the example, we are doing two await operations sequentially:

            const user = await github.fetchGitHubUser('zhentian-wan');
            const repos = await github.fetchGitHubRepos('zhentian-wan');

    Remember that 'await' will pause the JS execution until promise resolve or reject.

    So if one api request cost 0.5s then two in sequence will cose 1s. 

    The way to solve the problem is by converting operations to concurrently:

            const userPromise = github.fetchGitHubUser('zhentian-wan');
            const reposPromise = github.fetchGitHubRepos('zhentian-wan');
    
            const user = await userPromise;
            const repos = await reposPromise;
    
            console.log(user.name);
            console.log(repos.length);

    Or we can use Promise.all:

            const [user, repos] = await Promise.all([
                            github.fetchGitHubUser('zhentian-wan'),
                            github.fetchGitHubRepos('zhentian-wan')
                        ]);
    
            console.log(user.name, repos.length);

    Of course, tow approaches are not the same, Promise.all will throw error if one of the request throw error. 

  • 相关阅读:
    python进阶学习chapter04(字符串相关)
    python进阶学习chapter03(迭代相关)
    python学习笔记之collections模块的使用
    python进阶学习chapter02(列表、字典、集合操作)
    python接口测试之json模块的使用
    python接口测试之如何发送邮件
    python接口测试之如何操作excel
    python unittest库的入门学习
    python requests库学习笔记
    重建二叉树*
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6807329.html
Copyright © 2011-2022 走看看