理解 Promise


前言

    Promise 是异步编程的一种解决方案,比传统的解决方案——callback回调函数和事件——更合理且更强大。它最早由社区提出并实现,ES6将其写进了语言标准,统一了用法,并原生提供了Promise对象。Promise说得通俗一点就是一种写代码的方式,并且是用来写JavaScript编程中的异步代码的


基本概念

名称

  • 译为“承诺”,这也就表达了将来会执行的操作,代表异步操作;

状态

  • pending状态(进行中)
  • fulfilled状态(已成功)
  • rejected状态(已失败)

特点

  • 一旦状态改变就不会再变 (两种状态改变:成功或失败)
    pending -> fulfilled
    ending -> rejected
  • 只有异步操作可以决定当前处于的状态,并且任何其他操作无法改变这个状态;

基本用法

创建Promise:Promise 对象是由关键字 new 及其构造函数来创建的。

代码如下(示例):

var promise = new Promise(function(resolve, reject){
    if (...) {
        resolve(value);
    } else {
        reject(error);
    }
})

    Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolvereject。它们是两个函数,由JavaScript引擎提供,不用自己部署。

    resolve作用是将Promise对象状态由“未完成”变为“成功”,也就是pending -> fulfilled,在异步操作成功时调用,并将异步操作的结果作为参数传递出去;而reject函数则是将Promise对象状态由“未完成”变为“失败”,也就是pending -> rejected,在异步操作失败时调用,并将异步操作的结果作为参数传递出去。

then
我们通过then方法,分别指定resolved状态和rejected状态的回调函数。

  • 参数一: Promise对象状态改为Resolved时调用 (必选)
  • 参数二: Promise对象状态改为Rejected时调用 (可选)
  promise.then(function(value) {
      // success
  }, function(error) {
      // failure
  });

执行顺序

let promise = new Promise(function(resolve, reject){
    console.log("1");
    resolve()
});
promise.then(() => console.log("2"));
console.log("3")

// 1
// 3
// 2

    执行后,我们发现输出顺序总是 1 > 3 > 2。表明,在Promise新建后会立即执行,所以首先输出 1。然后,then方法指定的回调函数将在当前脚本所有同步任务执行完后才会执行,所以2 最后输出。

与定时器混用

let promise = new Promise(function(resolve, reject){
    console.log("1");
    resolve();
});
setTimeout(function(){
	console.log("2");	
}, 0);
promise.then(() => console.log("3"));
console.log("4");

// 1
// 4
// 3
// 2

    可以看到,结果输出顺序总是:1 > 4 > 3 > 2。1与4很好理解,而2与3先输出Promise的then,而后输出定时器任务。原因则是Promise属于JavaScript引擎内部任务,而setTimeout则是浏览器API,而引擎内部任务优先级高于浏览器API任务。


PromiseJavaScript 中处理异步编程的一种机制。它是一个代表了未来可能完成或失败的操作的对象。Promise 对象可以用来处理异步操作,比如从服务器获取数据、读取文件等等。 Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。当一个 Promise 对象由 pending 状态转变为 fulfilled 或 rejected 状态时,它被称为“settled”。 使用 Promise 可以更优雅地处理异步操作。通过 Promise,我们可以将异步的操作包装为一个对象,然后通过链式调用的方式来处理返回的结果或错误。这种方式避免了回调地狱(callback hell)的问题,使得代码更加可读、易于维护。 Promise 提供了一些方法来处理异步操作的结果,包括 then、catch 和 finally。then 方法用于处理成功的结果,catch 方法用于处理错误,finally 方法无论成功或失败都会执行。 例如,我们可以通过以下方式创建一个 Promise 对象并使用 then 方法处理异步操作的结果: ```javascript const promise = new Promise((resolve, reject) => { // 异步操作 // 如果操作成功,则调用 resolve(result) // 如果操作失败,则调用 reject(error) }); promise.then((result) => { // 处理成功的结果 }).catch((error) => { // 处理错误 }); ``` 通过使用 Promise,我们可以更加清晰地表达异步操作的顺序和逻辑,提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值