今天在網上查看promise資料,發現promise有三種狀態,pending,fullfilled,rejected.分別對應了初始化狀態,成功狀態及失敗狀態。爲了理解寫測試代碼來實驗:
function a(isTrue) {
return new Promise(function (resolve, reject) {
if (isTrue) {
console.log('--------fun reslove');
resolve('Hello ');
}
else {
console.log('-------fun reject');
reject('Hi ');
}
});
}
a(true).then(function (res) {
console.log('---------result reslove');
console.log(res);
}, function (rej) {
console.log('---------result reject');
console.log(rej);
});
獲得結果:
--------fun reslove
---------result reslove
Hello
再次運行代碼,改成a(false)獲得結果:
-------fun reject
---------result reject
Hi
獲得結果說明正確和失敗的結果分別用resolve 和reject 來返回及接收,但隨後就產生了疑問。
在獲得promise對象後,用.then來處理,他有2個參數,第一個爲resolve,用於接收成功狀態的值,第二個爲reject用來接收失敗狀態的值,同時有一個catch 的方法,解釋是至關於Onreject函數的一種簡單寫法及then(fn).catch(fn)===then(fn).then(null,fn)。隨即修改代碼
a(false).then(function (res) {
console.log('---------result reslove');
console.log(res);
}).catch(function(err){
console.log('---------result reject');
console.log(err);
})
運行結果獲得
-------fun reject
---------result reject
Hi
獲得結果徹底符合預計,隨即完善代碼,以下:
function a(isTrue) {
return new Promise(function (resolve, reject) {
var client = require('redis').createClient();
var key = 'err';
var value = 'false';
client.sadd(key, value, function (err, reply) {
if (err) {
reject(err);
}
else {
resolve(reply);
}
});
client.quit();
})
}
a().then(function (res) {
console.log('---------result reslove');
console.log(res);
}).catch(function(err){
console.log('---------result reject');
console.log(err);
})
該試例在redis 沒有打開服務狀態下執行,獲得結果以下:
------------fun reject
---------result reject
{ AbortError: Stream connection ended and command aborted.
.......
.......
}
同樣獲得了預期結果。思考是否每次調用都須要處理promise對象都須要寫reject接收,因而修改代碼以下:
function a(isTrue) {
return new Promise(function (resolve, reject) {
var client = require('redis').createClient();
var key = 'err';
var valus = 'false';
client.sadd(key, value, function (err, reply) {
if (err) {
console.log('------------fun reject');
reject(err);
}
else {
console.log('------------fun resolve');
resolve(reply);
}
});
client.quit();
}).catch(function (err) {
console.log('--------------fun err');
return err;
})
}
a().then(function (res) {
console.log('----------result resolve');
console.log(res);
},function(err){
console.log('----------result reject');
console.log(err);
})
運行獲得以下結果:
------------fun reject
--------------fun err
----------result resolve
{ AbortError: Stream connection ended and command aborted.
...........
...........
}
發如今發生錯誤時去調用了reject,執行reject後直接跳進了catch,利用return 返回時promise對象狀態爲成功態。在處理Promise對象時,resolve直接獲取到了錯誤的值。此刻若使用promise.all將由於沒法判斷錯誤狀態,所有返回。
redis