Promise
发布日期:2021-11-21 16:35:25
浏览次数:8
分类:技术文章
本文共 2041 字,大约阅读时间需要 6 分钟。
Promise
Promise 是一个对象,它代表了一个异步操作的最终完成或者失败。由于它的then方法和catch、finally方法会返回一个新的Promise所以可以允许我们链式调用,解决了传统的回调地狱问题。
再说一下then以及catch方法: 1. Promise的状态一经改变就不能再改变。 2. .then和.catch都会返回一个新的Promise。 3. catch不管被连接到哪里,都能捕获上层未捕捉过的错误。 4. 在Promise中,返回任意一个非 promise 的值都会被包裹成 promise 对象,例如return 2会被包装为return Promise.resolve(2)。 5. Promise 的 .then 或者 .catch 可以被调用多次, 但如果Promise内部的状态一经改变,并且有了一个值,那么后续每次调用.then或者.catch的时候都会直接拿到该值。 6. .then 或者 .catch 中 return 一个 error 对象并不会抛出错误,所以不会被后续的 .catch 捕获。 7. .then 或 .catch 返回的值不能是 promise 本身,否则会造成死循环。 8. .then 或者 .catch 的参数期望是函数,传入非函数则会发生值透传。 9. .then方法是能接收两个参数的,第一个是处理成功的函数,第二个是处理失败的函数,再某些时候你可以认为catch是.then第二个参数的简便写法。 10. .finally方法也是返回一个Promise,他在Promise结束的时候,无论结果为resolved还是rejected,都会执行里面的回调函数。 再说一下finally方法: 1. .finally()方法不管Promise对象最后的状态如何都会执行 2. .finally()方法的回调函数不接受任何的参数,也就是说你在.finally()函数中是没法知道Promise最终的状态是resolved还是rejected的 3. 它最终返回的默认会是一个上一次的Promise对象值,不过如果抛出的是一个异常则返回异常的Promise对象。 最后说一下all以及race方法: 1. Promise.all()的作用是接收一组异步任务,然后并行执行异步任务,并且在所有异步操作执行完后才执行回调。 2. .race()的作用也是接收一组异步任务,然后并行执行异步任务,只保留取第一个执行完成的异步操作的结果,其他的方法仍在执行,不过执行结果会被抛弃。 3. Promise.all().then()结果中数组的顺序和Promise.all()接收到的数组顺序一致。 4. all和race传入的数组中如果有会抛出异常的异步任务,那么只有最先抛出的错误会被捕获,并且是被then的第二个参数或者后面的catch捕获;但并不会影响数组中其它的异步任务的执行。
手写实现:
function Promise(exector) { let self = this; //status表示一种状态 let status = "pending"; let value = undefined; let reason = undefined; //成功执行 function resolve(value) { if (status == 'pending') { self.value = value; self.status = "resolve"; } } //执行失败 function reject(reason) { if (status == 'pending') { self.reason = reason; self.status = "reject" } } //对异常操作 try { exector(resolve, reject) } catch (e) { reject(e) } //设置promise的then方法 Promise.prototype.then = function(reject, resolve) { let self = this; if (this.status == 'resolve') { reject(self.value) } if (this.status == 'reject') { resolve(self.reason) } } } //new 一个promise 进行测试 let promise = new Promise((reject, resolve) => { resolve("return resolve"); }); promise.then(data => { console.log(`success${data}`);}, err => {
console.log(`err${err}`);})
转载地址:https://blog.csdn.net/yyychocolate/article/details/107848814 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月03日 21时11分35秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
记一次iOS闪退问题的定位:NSLog闪退
2019-04-27
Unity打开照相机与打开本地相册然后在Unity中显示照片(Android与iOS)
2019-04-27
无需接入SDK即可在Unity中获取经纬度(Android/iOS),告诉我你的坐标
2019-04-27
Unity获取系统信息SystemInfo(CPU、显卡、操作系统等信息)
2019-04-27
Unity中获取物体的尺寸(size)的三种方法
2019-04-27
Unity中的关节组件和绳子效果的实现
2019-04-27
Unity可视化编程插件: Bolt,可以像UE4的蓝图那样啦
2019-04-27
Android的.dex、.odex与.oat文件扫盲
2019-04-27
Unity移动应用如何在Bugly上查看崩溃堆栈
2019-04-27
一分钟搞明白Android的.so文件、ABI和CPU的关系
2019-04-27
UGUI的Text描边Outline拓展
2019-04-27
游戏性能指标参考,游戏质量白皮书下载
2019-04-27
游戏帧同步学习笔记
2019-04-27
Mac苹果电脑分辨率不够用,安装SwitchResX这个软件完美解决
2019-04-27
iOS Info.plist知多少
2019-04-27
XCode9之后命令打包需要使用OptionExport.plist
2019-04-27
关于iOS XCode的entitlements文件
2019-04-27
Airtest自动化测试神器,教你实现Unity自动化测试
2019-04-27