博客
关于我
不可不知的promise
阅读量:797 次
发布时间:2023-03-29

本文共 2595 字,大约阅读时间需要 8 分钟。

Promise的深入理解:从用法到实现

第一部分:Promise的用法

关键点

Promise是JavaScript异步编程的一种强大工具,它通过链式调用解决了传统回调函数的嵌套问题。以下是Promise的核心特点及使用方法:

  • Promise的定义:Promise是一个表示异步操作的抽象语义,允许我们用.then()方法将非同步操作串联起来。
  • 创建Promise:使用new Promise构造一个Promise实例,传递一个executor函数。executor接受两个回调函数:resolvereject,分别用于处理成功和失败的情况。
  • 状态管理:每个Promise实例都有三种状态:pending(等待处理)、resolved(成功)、rejected(失败)。
  • 链式调用.then()方法返回一个新的Promise实例,允许我们通过链式调用实现非同步流程的组合。
  • 值传递then方法接收两个回调函数,返回的结果决定了下一个Promise的状态。如果返回的是Promise实例,则其结果会被继承;如果返回普通值,则作为下一个then的成功结果。
  • 异常处理:使用.catch()方法可以捕获并处理 Promise 失败的原因,或者在.finally()中执行无论成功与否都需要执行的操作(这是ES2018的新增功能)。
  • 并发执行Promise.all()可以同时执行多个Promise,返回所有结果的最终状态。Promise.race()则根据最先完成的Promise返回结果,不管其状态。
  • 代码对比

    传统的异步编程和Promise的异步编程对比:

    // 传统异步编程let fs = require('fs');let school = [];fs.readFile('./name.txt', 'utf8', function(err, data) {    school.push(data);    fs.readFile('./age.txt', 'utf8', function(err, data) {        school.push(data);        console.log(school);    });});// Promise 异步编程let fs = require('fs');let school = [];function read(url, encoding) {    return new Promise(function(resolve, reject) {        fs.readFile(url, encoding, function(err, data) {            if (err) {                reject(err);            } else {                resolve(data);            }        });    });}read('name.txt', 'utf8')    .then(function(data) {        return read(data, 'utf8');    })    .then(function(data) {        return read(data, 'utf8');    })    .catch(function(err) {        console.log('错误:', err);    });

    通过上述代码对比,可以看出Promise的写法更加简洁,代码结构更清晰,减少了回调函数的嵌套,提高了代码的可读性和维护性。

    第二部分:Promise的实现

    Promise的核心实现

    遵循Promise A+规范,实现一个基础的Promise类:

    function Promise(executor) {    this.value = undefined; // 成功的值    this.reason = undefined; // 失败的原因    this.status = 'pending'; // 状态:'pending' | 'resolved' | 'rejected'    const resolve = function(value) {        if (this.status === 'pending') {            this.value = value;            this.status = 'resolved';        }    };    const reject = function(reason) {        if (this.status === 'pending') {            this.reason = reason;            this.status = 'rejected';        }    };    executor(resolve, reject);}// 添加 then 方法Promise.prototype.then = function(onFulfilled, onRejected) {    if (this.status === 'resolved') {        onFulfilled(this.value);    } else if (this.status === 'rejected') {        onRejected(this.reason);    }};

    测试工具

    为了验证Promise实现是否符合规范,可以使用promises-aplus-tests包进行测试:

    npm install promises-aplus-tests -g

    通过测试可以验证我们的Promise实现是否符合Promise A+规范,确保所有状态转换和错误处理都符合要求。

    结语

    Promise是现代JavaScript开发中处理异步操作的核心工具,其链式调用模式和强大的功能使得代码更加简洁且易于管理。在实际开发中,合理使用Promise可以显著提升代码的可读性和可维护性。

    转载地址:http://vqhfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现binomial coefficient二项式系数算法(附完整源码)
    查看>>
    Objective-C实现CaesarsCiphe凯撒密码算法(附完整源码)
    查看>>
    Objective-C实现check strong password检查密码强度算法(附完整源码)
    查看>>
    Objective-C实现circle sort圆形排序算法(附完整源码)
    查看>>
    Objective-C实现coulombs law库仑定律算法(附完整源码)
    查看>>
    Objective-C实现DBSCAN聚类算法(附完整源码)
    查看>>
    Objective-C实现dijkstra银行家算法(附完整源码)
    查看>>
    Objective-C实现Dinic算法(附完整源码)
    查看>>
    Objective-C实现disjoint set不相交集算法(附完整源码)
    查看>>
    Objective-C实现DisjointSet并查集的算法(附完整源码)
    查看>>
    Objective-C实现djb2哈希算法(附完整源码)
    查看>>
    Objective-C实现DNF排序算法(附完整源码)
    查看>>
    Objective-C实现double factorial iterative双阶乘迭代算法(附完整源码)
    查看>>
    Objective-C实现double factorial recursive双阶乘递归算法(附完整源码)
    查看>>
    Objective-C实现double hash双哈希算法(附完整源码)
    查看>>
    Objective-C实现double linear search recursion双线性搜索递归算法(附完整源码)
    查看>>
    Objective-C实现DoublyLinkedList双链表的算法(附完整源码)
    查看>>
    Objective-C实现DPLL(davisb putnamb logemannb loveland)算法(附完整源码)
    查看>>
    Objective-C实现Edmonds-Karp算法(附完整源码)
    查看>>
    Objective-C实现EEMD算法(附完整源码)
    查看>>