(浅)promise的简单使用(小白笔记)

本文深入讲解Promise的概念及其在异步编程中的应用。介绍Promise的基本用法、如何利用Promise改进传统异步操作,如封装AJAX请求及文件读取等。同时,通过示例展示Promise链式调用的优势。
摘要由CSDN通过智能技术生成

promise的含义

promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

Promise对象有以下两个特点。

  1. 对象的状态不受外界影响
  2. 一旦状态改变,就不会再变,任何时候都可以得到这个结果

基本用法

ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。

    // 定义一个promise对象,创建一个实例
    const promise = new Promise(function (resolve, reject) {
      // resolve定义成功的状态
      // reject定义失败的状态
      // 模拟进行异步操作
      setTimeout(() => {
        // resolve('成功了')
        reject('失败了')
      }, 1000);
    })
    promise.then((value) => {
      // 成功的回调
      console.log(value);
    }), (error => {
      // 成功的回调
      console.error(error);
    })

使用pormise封装ajax

    // 使用promise 封装ajax请求
    const p = new Promise((resolve, reject) => {
      // 创建xml对象
      const xhr = new XMLHttpRequest();
      // 初始化请求
      xhr.open('GET', 'https://static.chexx01.cn/images/omc/815770d8-647e-479d-8a3b-89e600679970.jpg')
      // 发送请求
      xhr.send()
      // 获取状态码,处理响应结果
      xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
          if (xhr.status >= 200 && xhr.status < 300) {
            resolve(xhr.response)
          } else {
            reject(xhr.status)
          }
        }
      }
    })
    p.then(value => {
      console.log(value);
    }), function (err) {
      console.error(err);
    }

使用promise对文件进行操作

const fs = require('fs');
// 原生写法
fs.readFile('./1.md', (err, data) => {
  if (err) {
    throw (err)
  }
  // 需要用转成字符串,因为刚开始的数据是Buffer 
  console.log(data.toString());
})
// 使用promise进行封装
const p = new Promise((resolve, rejects) => {
  fs.readFile('./1.m3d', (err, data) => {
    if (err) {
      rejects(err)
    } else {
      resolve(data)
    }
  })
})
p.then((value) => {
  console.log(value.toString());
}), function (error) {
  console.error('读取文件失败');
}

promise的then的链式调用

需求:读取多个文件,并把他们合拼

// 原生写法
fs.readFile('./1.md', (err, data1) => {
  fs.readFile('./2.md', (err, data2) => {
    fs.readFile('./3.md', (err, data3) => {
      let result = data1 + '\r\n' + data2 + '\r\n' + data3 + '\r\n'
      console.log(result);
    })
  })
})
// promise的then的链式调用
const p = new Promise((resolve, rejects) => {
  fs.readFile('./1.md', (err, data) => {
    if (err) {
      rejects(err)
    } else {
      resolve(data)
    }
  })
})
p.then((value) => {
  return new Promise((resolve, rejects) => {
    fs.readFile('./2.md', (err, data) => {
      if (err) {
        rejects(err)
      } else {
        resolve([value, data])
      }
    })
  })
}).then((value) => {
  return new Promise((resolve, rejects) => {
    fs.readFile('./3.md', (err, data) => {
      resolve([value, data])
    })
  })
}).then(value => {
  console.log(value.toString());
})

更多资料
https://www.yuque.com/ostwind/es6/docs-promise#b267cd07

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值