对promise的理解

134 阅读2分钟

promise

目的:1、是为了解决异步编程中回调地狱的问题 2、将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数

3、Promise 对象提供统一的接口,使得控制异步操作更加容易。

使用:1、Promise对象是一个构造函数,可以使用 new 来调用 Promise 的构造器来进行实例化来生成Promise实例,

2、Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve,否则调用 reject。

let promise = new Promise((resolve,reject)=>()})

3、可以调用 promise.then() 方法,then方法可以接受两个回调函数作为参数

成功,就会执行then方法的第一个回调函数 失败,就会执行then方法的第二个回调函数

const fs = require('fs')
// 封装读取文件内容的promise函数
function hmReadFile (filename) {
  return new Promise((resolve, reject) => {
    fs.readFile(filename, 'utf-8', (err, data) => {
      if (err) {
        reject(err)
      } else {
        resolve(data)
      }
    })
  })
}
// 调用promise函数
hmReadFile('./1.txt')
  .then(data => {
    console.log('1.txt: ' + data)
  })
  .catch(err => {
    console.log(err)
  })

promise原理

1、所谓Promise,简单说就是一个容器,里面异步操作的结果

2、Promise对象的状态不受外界影响,只受异步操作的结果影响

3、Promise对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)

3、Promise对象的状态改变(一旦改变,状态不可逆),只有两种可能:

(1)从pending(进行中)变为fulfilled(已成功) (2)从pending(进行中)变为rejected(已失败)

promise特点:

1、promise创建就会执行他里面的代码

2、把创建promise实例的代码做了一个封装,好处就是只有在调用这个方法的时候才会去执行promise里面的代码,而且要创建多个promise实例的时候比较简洁

	// 封装原生ajax请求的promise函数
	function ajaxText(url) {
        return new Promise((resolve, reject) => {
          const xhr = new XMLHttpRequest();
          xhr.open("get", url);
          xhr.onload = () => {
            if (xhr.status == 200) {
              resolve(xhr.responseText);
            } else {
              reject(xhr.responseText);
            }
          };
          xhr.send();
        });
      }
	// 调用promise函数
      ajaxText("https://autumnfish.cn/api/joke")
        .then((data) => {
          console.log("data:" + data);
        })
        .catch((err) => {
          console.log("err:" + err);
        });
function jqAjax({url, type, data}){
    return new Promise((resolve, reject) => {
        $.ajax({
            url,
            type,
            data,
            success: (backData)=>{
                resolve(backData);
            },
            error: () => {
                reject('请求失败');
            }
        });
    });
}

jqAjax({url:'https://autumnfish.cn/api/joke/list', type:'get', data:{num:4}}).then(backData=>{
    console.log(backData);
});

promise的方法:

1、catch(),抓取错误的

2、静态方法Promse.all()在处理多个异步处理时非常有用,比如说一个页面上需要等两个或多个ajax的数据回来以后才正常显示,在此之前只显示loading图标。

3、静态方法Promise.race() ,Promse.race就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态