两只小蚂蚁

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  77 随笔 :: 0 文章 :: 0 评论 :: 33638 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Promise

1. 定义

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

注意:Promise构造函数的参数是一个函数,并且该函数的二个参数也是函数。

promise.then(
    function(value) {//resolved状态的回调函数
    // success
    }
    , function(error) {//rejected状态的回调函数
    // failure
    }
);

注意:Promise的实例用.then指定resolved和rejected状态的回调函数。其中,第二rejected回调函数可以为空。
注意:.then指定的回调函数是异步回调函数,需要注意运行时机(同步代码完成之后)和this指针指向(window)

2. 缺陷

  • Promise对象一旦建立就会立即执行
  • 无法取消Promise
  • 如果未指定rejected状态的回调函数,内部错误无法抛出到外部
  • Promise函数执行中时,无法得知执行进度

3. 状态

Promise对象的状态有3种:

  • Pending
  • Fulfilled
  • Rejected
    只有在函数内部可以更改状态值,外部无法改变。
    状态改变后,无法再次改变,重新添加回调函数将会立即得到相同结果。
let pms = new Promise(
    function(rlv,rjt){
        rlv(1);
    }
);
pms.then(
    function(value){
        console.log(value)
    }
);//1
//再次添加
pms.then(
    function(value2){
        console.log(value2)
    }
);//1

Promise可以嵌套Promise,如下:

const p1 = new Promise(function (resolve, reject) {
  // ...
});

const p2 = new Promise(function (resolve, reject) {
  // ...
  resolve(p1);
})

4. Promise.then的链式调用

Promise.then方法返回的是一个新的Promise实例,因此可以像下面这样调用

getJSON("/posts.json").then(function(json) {
  return json.post;
}).then(function(post) {
  // ...
});

5. Promise.catch和finally

  • catch总是捕捉距离最近的promise返回
    因此要处理前一个Promise的错误应把catch放在then之前。
    因为then返回的也是一个promise,如果then内部出现错误,则catch捕捉到的就是then的错误。
  • finally(ES2018)不管promise最终是什么状态,都会执行

6. Promise.all 和 Promise.race

all:所有都变成fulfilled,则返回fulfilled。任意一个编程rejected,则返回rejected
race:任意一个率先编程fulfilled或rejected,则返回fulfilled或rejected

const pa = Promise.all([p1, p2, p3]);
const pr = Promise.race([p1, p2, p3]);

参考:http://es6.ruanyifeng.com/#docs/promise

posted on   两只小蚂蚁  阅读(167)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示