Promise 对象方法总结

ECMAscript 6 原生提供了 Promise 对象。

Promise

在这里插入图片描述

Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息,是一套异步操作处理机制。

实现一个简单的Promise,具备then 与 catch方法
// 如有精力,考虑一下如何实现链式调用
function myPromise(executor){
    // ...你的实现
}

new myPromise((res,rej)=>{
    console.log(1)
    res('success')
}).then(console.log)

new myPromise((res,rej)=>{
    console.log(2)
    rej('error')
}).then(console.log)
.catch(err=>{
    console.log('----')
    console.log(err)
})

一、Promise特点

  • 可以在一系列异步操作中,灵活地处理错误,避免了层层嵌套的回调函数。

Promise 也有一些缺点。首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。第三,当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

二、Promise的创建

const promise = new Promise(function(resolve, reject) {
  // ... some code
 
  if (/* 异步操作成功 调用resolve */){
    resolve(value);
  } else {
    /* 异步操作失败 调用reject */
    reject(error);
  }
});

resolve:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

​ reject:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去;

三、Promise.prototype.then()

Promise实例生成以后,可以用then方法(then方法是定义在原型对象Promise.prototype上的。它的作用是为 Promise 实例添加状态改变时的回调函数。)、catch方法分别指定Resolved状态和Rejected状态的回调函数:

ew Promise(function(resolve,reject) {
    let num = Math.random() * 2;
    console.log("产生的随机数为:" + num);
    setTimeout(function () {
        if(num < 1) {
            console.log("执行成功");
            resolve("200 OK");
        } else {
            console.log("执行失败");
            reject("失败原因num为:" + num);
        }
    }, num * 1000);
}).then(function(r) {
    console.log("then:" + r);
}).catch(function(j) {
    console.log("catch:" + j);
});

四、Promise.prototype.catch()

Promise.prototype.catch()方法用于指定发生错误时的回调函数。

const p1 = new Promise(function cb(resolve, reject) {
    setTimeout(() => {
        console.log('欢迎')
        reject()
    }, 3000)
})
p1.then(_ => {
    setTimeout(() => {
        console.log('谢谢光临')
    }, 2000)
}).catch(_ => {
    console.log('出错了')
})

当promise抛出一个错误,就被catch()方法指定的回调函数捕获。

如果 Promise 状态已经变成resolved,再抛出错误是无效的。

五、Promise.prototype.finally()

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

这避免了同样的语句需要在**then()catch()**中各写一次的情况。

p.finally(onFinally);

p.finally(function() {
   // 返回状态为(resolved 或 rejected)
});

参数:

  • onFinally
  • Promise 结束后调用的Function。

返回值:

  • ​返回一个设置了 finally 回调函数的Promise对象。

六、Promise.all()

Promise.all(iterable)方法返回一个实例,此实例在 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"]

Promise对象解决回调地狱层层嵌套的问题。

通过then方法分别制定resolved状态和rejected状态的回调函数。

Promises 可以做很多事情。如果有什么返回了一个promise,你可以在后面加上 .then() 来传入成功和失败的回调函数。或者,你可以在后面加上 .catch() 如果你想添加一个操作失败的回调函数。

同步回调结构,和异步promise结构

传统的同步回调结构,和异步promise结构

同步
try {
  var value = myFunction();
  console.log(value);
} catch(err) {
  console.log(err);
}

异步
myFunction().then(function(value) {
  console.log(value);
}).catch(function(err) {
  console.log(err);
});

第一个同步例子中,必须等待 myFunction( ) 执行完成,并返回 value值,在此之前,后续其它的代码无法执行。
第二个异步例子中,myFunction( ) 返回一个promise对象,下面的代码可以继续执行。当promise成功resolves后,then( ) 中的函数会异步地执行。

参考大佬:https://blog.csdn.net/m0_46532221/article/details/106528918

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值