• 【JavaScript】Promise


    以下内容为学习记录,可以参考 MDN 原文。

    环境

    • node v12.18.1
    • npm 6.14.5
    • vscode 1.46
    • Microsoft Edge 83

    概念

    Promise 对象用于表示一个异步操作的最终完成 (或失败),及其结果值。

    构造函数

    Promise 构造函数主要用于包装不支持 promise 的函数。

    const promise1 = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('foo');
      }, 300);
    });
    
    promise1.then((value) => {
      console.log(value);
      // expected output: "foo"
    });
    
    console.log(promise1);
    // expected output: [object Promise]
    

    静态方法

    all

    Promise.all(iterable) 方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败的原因是第一个失败 promise 的结果。

    const promise1 = Promise.resolve(3);
    const promise2 = 42;
    const promise3 = new Promise((resolve, reject) => {
      setTimeout(resolve, 100, 'foo');
    });
    
    Promise.all([promise1, promise2, promise3]).then((values) => {
      console.log(values);
    });
    // expected output: Array [3, 42, "foo"]
    

    race

    Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个 promise 解决或拒绝,返回的 promise 就会解决或拒绝。

    const promise1 = new Promise((resolve, reject) => {
      setTimeout(resolve, 500, 'one');
    });
    
    const promise2 = new Promise((resolve, reject) => {
      setTimeout(resolve, 100, 'two');
    });
    
    Promise.race([promise1, promise2]).then((value) => {
      console.log(value);
      // Both resolve, but promise2 is faster
    });
    // expected output: "two"
    

    reject

    Promise.reject() 方法返回一个带有拒绝原因的 Promise 对象。

    function resolved(result) {
      console.log('Resolved');
    }
    
    function rejected(result) {
      console.error(result);
    }
    
    Promise.reject(new Error('fail')).then(resolved, rejected);
    // expected output: Error: fail
    

    resolve

    Promise.resolve(value) 方法返回一个以给定值解析后的 Promise 对象。如果这个值是一个 promise,那么将返回这个 promise;如果这个值是 thenable(即带有"then" 方法),返回的 promise 会“跟随”这个 thenable 的对象,采用它的最终状态;否则返回的 promise 将以此值完成。此函数将类 promise 对象的多层嵌套展平。

    const promise1 = Promise.resolve(123);
    
    promise1.then((value) => {
      console.log(value);
      // expected output: 123
    });
    

    实例方法

    catch

    catch() 方法返回一个 Promise,并且处理拒绝的情况。

    const promise1 = new Promise((resolve, reject) => {
      throw 'Uh-oh!';
    });
    
    promise1.catch((error) => {
      console.error(error);
    });
    // expected output: Uh-oh!
    

    then

    then() 方法返回一个 Promise。它最多需要有两个参数:Promise 的成功和失败情况的回调函数。

    const promise1 = new Promise((resolve, reject) => {
      resolve('Success!');
    });
    
    promise1.then((value) => {
      console.log(value);
      // expected output: "Success!"
    });
    

    finally

    finally() 方法返回一个 Promise。在 promise 结束时,无论结果是 fulfilled 或者是 rejected,都会执行指定的回调函数。这为在 Promise 是否成功完成后都需要执行的代码提供了一种方式。

    let isLoading = true;
    
    fetch(myRequest).then(function(response) {
        var contentType = response.headers.get("content-type");
        if(contentType && contentType.includes("application/json")) {
          return response.json();
        }
        throw new TypeError("Oops, we haven't got JSON!");
      })
      .then(function(json) { /* process your JSON further */ })
      .catch(function(error) { console.error(error); /* this line can also throw, e.g. when console = {} */ })
      .finally(function() { isLoading = false; });
    

    keys

    keys() 方法返回一个新的 Iterator 对象,该对象按插入顺序包含 Set 对象中每个元素的值。

    const set1 = new Set();
    set1.add(42);
    set1.add('forty two');
    
    const iterator1 = set1.values();
    
    console.log(iterator1.next().value);
    // expected output: 42
    
    console.log(iterator1.next().value);
    // expected output: "forty two"
    

    values

    values() 方法返回一个 Iterator 对象,该对象按照原 Set 对象元素的插入顺序返回其所有元素。

    const set1 = new Set();
    set1.add(42);
    set1.add('forty two');
    
    const iterator1 = set1.values();
    
    console.log(iterator1.next().value);
    // expected output: 42
    
    console.log(iterator1.next().value);
    // expected output: "forty two"
    
  • 相关阅读:
    《高性能MySQL》读书笔记--Schema与数据类型优化
    小程序从零开始 新手必看(2)
    小程序从零开始 新手必看(1)
    Web 前端
    摒弃 react-redux: 非侵入式状态共享实现
    Web 前端
    Web 前端
    Web 前端
    vue实现打印、批量打印
    JS脱敏带表情的字符串
  • 原文地址:https://www.cnblogs.com/jiangbo44/p/13654806.html
Copyright © 2020-2023  润新知