Promise一但新建(new)便立即執(zhí)行,不能中途取消玉组;如果內(nèi)部不reject外部不捕獲則錯(cuò)誤不會反應(yīng)到外部;無法得知當(dāng)前Promise狀態(tài)丁侄。
Promise實(shí)例生成以后惯雳,可以用then方法分別指定Resolved狀態(tài)和Reject狀態(tài)的回調(diào)函數(shù)
promise.then(function(data){},function(err){})
- promise新建后立即執(zhí)行,而then方法會把callback放倒本輪事件循環(huán)結(jié)束執(zhí)行
let promise = new Promise(function(resolve, reject) {
console.log('Promise');
resolve();
});
promise.then(function() {
console.log('Resolved.');
});
console.log('Hi!');
//Promise
//Hi!
//Resolved.
Promise.prototype.then
返回一個(gè)新
的promise實(shí)例Promise.prototype.catch
既可以捕獲異步方法中reject的err鸿摇,同時(shí)then方法指定的回調(diào)函數(shù)石景,如果運(yùn)行中拋出錯(cuò)誤,也會被catch方法捕獲拙吉。也是返回新Promise對象Promise對象的錯(cuò)誤具有冒泡特性潮孽,總會向后傳遞。
跟傳統(tǒng)的try/catch代碼塊不同的是庐镐,如果沒有使用catch方法指定錯(cuò)誤處理的回調(diào)函數(shù)恩商,Promise對象拋出的錯(cuò)誤不會傳遞到外層代碼变逃,即不會有任何反應(yīng)
var someAsyncThing = function () {
return new Promise(function (resolve, reject) {
// 下面一行會報(bào)錯(cuò)必逆,因?yàn)閤沒有聲明
resolve(x + 2);
});
};
someAsyncThing().then(function () {
console.log('everything is great');
});
- 上面代碼中,Promise 指定在下一輪“事件循環(huán)”再拋出錯(cuò)誤揽乱,結(jié)果由于沒有指定使用try...catch語句名眉,就冒泡到最外層,成了未捕獲的錯(cuò)誤凰棉。因?yàn)榇藭r(shí)损拢,Promise的函數(shù)體已經(jīng)運(yùn)行結(jié)束了,所以這個(gè)錯(cuò)誤是在Promise函數(shù)體外拋出的撒犀。
var 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