zoukankan      html  css  js  c++  java
  • [Javascript] Wait for the Fastest JavaScript Promise to Be Fulfilled with Promise.any()

    The Promise.any() method accepts an array (or any other iterable) of promises as a parameter. It returns a Promise object that is fulfilled with the value of the first input promise to fulfill:

    • As soon as any input promise is fulfilled, the returned Promise object is fulfilled with that value.
    • If all input promises are rejected, the returned Promise object is rejected with an AggregateError which has an errors property containing an array of all rejection reasons.

    Promise.any() can be used to race multiple promises against each other and find the first promise to be fulfilled.

    Please note that at the moment, the Promise.any() method is only implemented in Firefox Nightly. Make sure to use a polyfill in your application to make it work across browsers.

    const API_URL_1 = "https://starwars.egghead.training/";
    const API_URL_2 = "https://swapi.mariusschulz.com/";
    
    const output = document.getElementById("output");
    const spinner = document.getElementById("spinner");
    
    function query(rootURL, endpoint) {
      return fetch(rootURL + endpoint).then(response => {
        return response.ok
          ? response.json()
          : Promise.reject(Error("Unsuccessful response"));
      });
    }
    
    function queryAPI(endpoint) {
      return Promise.any([
        query(API_URL_1, endpoint),
        query(API_URL_2, endpoint)
      ]).catch(() => {
        return Promise.reject(
          Error(`Failed to fetch endpoint "${endpoint}"`)
        );
      });
    }
    
    function getFilmTitles(films) {
      return films
        .slice()
        .sort((a, b) => a.episode_id - b.episode_id)
        .map(film => `${film.episode_id}. ${film.title}`)
        .join("
    ");
    }
    
    queryAPI("films")
      .then(films => {
        output.innerText = getFilmTitles(films);
      })
      .catch(error => {
        console.warn(error);
        output.innerText = ":(";
      })
      .finally(() => {
        spinner.remove();
      });
  • 相关阅读:
    charles 抓包iOS模拟器 HTTPS请求
    tableView reloadData页面跳动问题
    测试swiftc 命令 插件无法使用的问题( PluginLoading: Required plug-in compatibility UUID.... )
    linux网络设置
    博客园markdown语法高亮
    django继承user类来定制自己的user类
    Django开发bug及问题记录
    震惊!男子使用这一手机设置,从此告别UC!
    吐槽手机的迷之信号
    声控皮卡丘小游戏
  • 原文地址:https://www.cnblogs.com/Answer1215/p/12336980.html
Copyright © 2011-2022 走看看