学会使用前端Promise(一)

322 阅读2分钟

前言

在我们开发前端项目的时候时常会应用到异步操作,比如ajax网络请求来处理后端数据的业务需求,但是往往产品不会让我们省心,业务需求总是异步同步交叉的,慢慢的我们会发现套了很多层回调来处理业务变成了回调地狱,这样使得我们的代码可读性变低复杂度变高了,这里我推荐使用Promise。

Promise介绍

Promise 是一个构造函数,是异步编程的一种解决方案。所谓Promse,它本身就是一个容器,里面保存着异步操作的结果,对的,这和回调函数类似。

Promise 容器本身不是异步的,而里面封装一个异步任务。他有三种状态,状态不受外界影响,即:

  1. pending(进行中)
  2. resolved(成功)
  3. rejected(失败)

Promise的基本用法

const promise = new Promise((resolve, reject) => {
  // 这里做异步任务(比如ajax 请求接口。这里暂时用定时器代替) 
  setTimeout(function () {
    var data = {
      retCode: 0,
      msg: 'qianguyihao'
    }; // 接口返回的数据 
    if (data.retCode == 0) { // 接口请求成功时调用 
      resolve(data);
    } else { // 接口请求失败时调用 
      reject({
        retCode: -1,
        msg: 'network error'
      });
    }
  }, 100);
})
// 接受异步结束后resolve或reject传递的参数
promise.then((data)=>{
    console.log('成功'+data)
},(err)=>{
    console.log('失败'+err)

})

Promise():Promise构造器主要用于包装不支持promise(返回值不是Promise)的函数。\

resolve作用是:将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;\

reject作用是:将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。\

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

promise.catch((err)=>{
    console.log('失败'+err)
})
// 抛出一个错误,大多数时候将调用catch方法
var p1 = new Promise(function(resolve, reject) {
  throw 'Uh-oh!';
});

p1.catch(function(e) {
  console.log(e); // "Uh-oh!"
});

// 在异步函数中抛出的错误不会被catch捕获到
var p2 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    throw 'Uncaught Exception!';
  }, 1000);
});

p2.catch(function(e) {
  console.log(e); // 不会执行
});

// 在resolve()后面抛出的错误会被忽略
var p3 = new Promise(function(resolve, reject) {
  resolve();
  throw 'Silenced Exception!';
});

p3.catch(function(e) {
   console.log(e); // 不会执行
});

catch:catch()方法返回一个Promise,处理失败情况的回调函数和捕获抛出的错误(异步函数中抛出的错误不会被catch捕获到)。

总结

通过使用Promise()构造器,Promise.resolve(),Promise.reject(),Promise.then(),Promise.catch()我们就可以解决回调地狱的问题了。