当前位置:网站首页>promise详解
promise详解
2022-08-10 23:29:00 【柳晓黑胡椒】
promise是什么
promise 是异步编程的一种解决方案:
从语法上,promise是一个对象,从它可以获取异步操作的消息;
从功能上,promise对象是用来封装一个异步操作并可以获取其结果数据
从意义上,它是承诺,承诺过一段时间会给你一个结果;
promise的优点
解决回调导致的代码难以维护
在使用js时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被称为回调地狱:
// 优化前
var sayhello = function (name, callback) {
setTimeout(function () {
console.log(name);
callback();
}, 1000);
};
sayhello("first", function () {
sayhello("second", function () {
sayhello("third", function () {
console.log("end");
});
});
});
// 优化后
var sayhello = function (name) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log(name);
resolve(); //在异步操作执行完后执行 resolve() 函数
}, 1000);
});
};
sayhello("first")
.then(function () {
return sayhello("second"); //仍然返回一个 Promise 对象
})
.then(function () {
return sayhello("third");
})
.then(function () {
console.log("end");
});
可读性
promise规范了这种异步场景的代码,相对于callback的方式,更加清晰易懂,语义化更强
可靠性
promise是原生支持的API,在各大浏览器中的运行机制是相同的,这保证了它的可靠性
信任问题
只能决议一次,决议值只能有一个,决议后无法改变;
任何then中的回调也只能被调用一次
promise的三种状态
- pending:初始状态,既不是成功,也不是失败状态
- fulfilled:操作成功
- rejected:操作失败
pending 状态的 Promise 对象可能会变为 fulfilled 状态并传递一个值给相应的状态处理方法,也可能变为失败状态 (rejected) 并传递失败信息。当其中任一种情况出现时,Promise 对象的 then 方法绑定的处理方法就会被调用
兼容性
对低版本不支持的浏览器可以使用开源的 polyfill 解决
基础使用方式
const p = new Promise((resolved, reject) => {
setTimeout(function () {
// resolved('成功'); //promise变为resolve成功状态
// or
reject("失败"); //promise变为rejected失败状态
}, 1000);
});
p.then(
(value) => {
},
(reason) => {
console.log("reason", reason);
}
);
Promise接口
prmose.prototype.then
返回一个新的Promise,
边栏推荐
猜你喜欢
随机推荐
Geogebra 教程之 01 什么是Geogebra,真的可以提高我们数学水平么?
安科瑞为工业能效行动计划提供EMS解决方案-Susie 周
回收站的文件删了怎么恢复,回收站文件恢复的两种方法
从Todolist入门Svelte框架
MySQL数据库基础操作
还在用 Xshell?你 out 了,推荐一个更现代的终端连接工具,好用到爆!
逮到一个阿里 10 年老 测试开发,聊过之后收益良多...
62.【彻底改变你对C语言指针的厌恶(超详细)】
如何快速把握行业机会,更高效地推陈出新,是一个重要的命题
数组 冒泡排序
canvas
【ORACLE】什么时候ROWNUM等于0和ROWNUM小于0,两个条件不等价?
GoldenGate中使用 exp/imp 进行初始化
部分准备金银行已经过时
如何判断一个数为多少进制?
postman+jmeter接口实例
正交基(线性代数)
开启新征程——枫叶先生第一篇博客
一文带你了解 ViewModel 的使用及源码解析
一条SQL查询语句是如何执行的?