一 . 概念
resolve
函数的作用是,将Promise
对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject
函数的作用是,将Promise
对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
写法:
promise
.then(function(data) { //cb
// success
})
.catch(function(err) {
// error
});
二 . 相关函数
Promise.prototype.catch() == then(null,rejection)
catch
语句捕获。
getJSON('/post/1.json').then(function(post) {
return getJSON(post.commentURL);
}).then(function(comments) {
// some code
}).catch(function(error) {
// 处理前面三个Promise产生的错误
});
2.2 promise 会吃掉错误,如果没有catch方法的错误处理函数,外层代码一样执行,promise对象抛出的错误不会传递到外层代码(与promise无关的外层代码)
const someAsyncThing = function() {
return new Promise(function(resolve, reject) {
// 下面一行会报错,因为x没有声明
resolve(x + 2);
});
};
someAsyncThing().then(function() {
console.log('everything is great');
});
setTimeout(() => { console.log(123) }, 2000);
// Uncaught (in promise) ReferenceError: x is not defined
// 123
好好体味这个:
const promise = new Promise(function (resolve, reject) {
resolve('ok');
setTimeout(function () { throw new Error('test') }, 0)
});
promise.then(function (value) { console.log(value) });
// ok
// Uncaught Error: test
Promise 指定在下一轮“事件循环”再抛出错误。到了那个时候,Promise 的运行已经结束了,所以这个错误是在 Promise 函数体状态结束后抛出的,会冒泡到最外层,成了未捕获的错误。
所以,错误抛不抛到最外层,取决于promise状态,状态完成了就抛到外层,状态没完成就吞掉错误,如果有catch就进行捕获。
promise.prototype.finally()
特点: 不接受参数,无论最后状态如何,都会执行该操作,是一个与状态无关的方法;
3. 对象包装成promise对象
方式一: promise.resolve();
1.特别注意参数是一个thenable对象,即实现了then方法的对象。Promise.resolve
方法会将这个对象转为 Promise 对象,然后就立即执行thenable
对象的then
方法。
let thenable = {
then: function(resolve, reject) {
resolve(42);
}
};
2.参数不具有then方法,或根本不是对象
则Promise.resolve
方法返回一个新的 Promise 对象,状态为resolved
。并且会立即执行then方法
const p = Promise.resolve('Hello');
p.then(function (s){
console.log(s)
});
// Hello
#其他重要概念
1.Promise 新建后就会立即执行。
then
方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行。
let promise = new Promise(function(resolve, reject) {
console.log('Promise');
resolve();
});
promise.then(function() {
console.log('resolved.');
});
console.log('Hi!'); 打印:promise hi! resolved
调用resolve
或reject
并不会终结 Promise 的参数函数的执行,这是因为立即 resolved 的 Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务
new Promise((resolve, reject) => {
return resolve(1);
// 后面的语句不会执行
console.log(2);
})