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中的回调也只能被调用一次
对低版本不支持的浏览器可以使用开源的 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,