promise是什么?
Promise是异步编程的一种解决方案,比传统的回调函数和事件更合理和强大。说得通俗一点就是一种写代码的方式,并且是用来写JavaScript编程中的异步代码的。
在没有promise前使用回调函数处理异步问题是,最大的问题就是回调地狱,也就是嵌套太深。如下:
setTimeout(function(){
console.log(1);
setTimeout(function(){
console.log(2);
setTimeout(function(){
console.log(3);
},2000);
},2000);
},2000);
所以出现了promise,很好的解决了回调地狱的问题。
使用 promise来改写的代码,如下:
new Promise(function (resolve, reject) {
setTimeout(function () {
console.log(1);
resolve(2);
}, 2000)
}).then(function (data) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log(data);
resolve(3);
},2000)
})
}).then(function(data){
setTimeout(function () {
console.log(data);
},2000);
})
基本用法
let p = new Promise((resolve, reject) => {
if (/* true 或者 false */) {
resolve(value)
} else {
reject(error)
}
})
p.then(function(value) {
// 如果p的状态被resolve了,就进入这里
}, function(error) {
// 如果p的状态被reject
})
一般学习Promise看到的第一段代码就是上面这样的。
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由JavaScript引擎提供,不用自己部署。
resolve函数的作用是,将Promise对象的状态从"未完成"变成"成功"。(即从pending变为resolved)。在异步操作成功的时候调用,并将异步操作结果作为参数传递出去;
reject函数的作用是,将promise对象的状态从"未完成"变成"失败"(即从pending变为rejected)。在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
Promise实例生成后,可以用then方法分别指定resolve状态和rejected状态的回调函数。
then方法可以接受两个回调函数作为参数,
第一个回调函数是promise对象的状态变为resolved的时候调用,
第二个回调函数是promise对象的状态变为rejected时调用。
其中第二个函数是可选的。这两个函数都接受Promise对象传出的值作为参数。
还有一种写法是通过 catch 来捕获失败的情况
let pm = new Promise(function (resolve, reject) {
// resolve();
reject();
})
pm.then(function () {
// resolve 会进入到第一个 function
console.log("成功");
}, function () {
// reject 会进入到第二个 function
console.log("失败");
});
当promise 状态变为resolved时,输出“成功”,当promise 状态变为reject时,输出“失败”。
let pm = new Promise(function (resolve, reject) {
// resolve();
reject();
})
pm.then(function () {
// resolve 会进入到第一个 function
console.log("成功");
}).catch(function(){
// reject 进入到 catch 方法里面
console.log('失败');
});
resolved()reject()都可以向下传参
let pm = new Promise(function (resolve, reject) {
resolve("value");
})
pm.then(function (data) {
console.log(data);
}).then(function (data) {
console.log(data);
});
最后输出value。
以上仅为个人见解,如有错误望指出。