今天在網上查看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 resloveHello再次運行代碼,改為a(false)得到結果:
-------fun reject---------result rejectHi得到結果說明正確和失敗的結果分別用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將因為無法判斷錯誤狀態,全部返回。
新聞熱點
疑難解答