今天在網(wǎng)上查看PRomise資料,發(fā)現(xiàn)promise有三種狀態(tài),pending,fullfilled,rejected.分別對(duì)應(yīng)了初始化狀態(tài),成功狀態(tài)及失敗狀態(tài)。為了理解寫測(cè)試代碼來實(shí)驗(yàn):
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);});得到結(jié)果:
--------fun reslove---------result resloveHello再次運(yùn)行代碼,改為a(false)得到結(jié)果:
-------fun reject---------result rejectHi得到結(jié)果說明正確和失敗的結(jié)果分別用resolve 和reject 來返回及接收,但隨后就產(chǎn)生了疑問。 在得到promise對(duì)象后,用.then來處理,他有2個(gè)參數(shù),第一個(gè)為resolve,用于接收成功狀態(tài)的值,第二個(gè)為reject用來接收失敗狀態(tài)的值,同時(shí)有一個(gè)catch 的方法,解釋是相當(dāng)于Onreject函數(shù)的一種簡(jiǎn)單寫法及
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);})運(yùn)行結(jié)果得到 ——-fun reject ———result reject Hi 得到結(jié)果完全符合預(yù)計(jì),隨即完善代碼,如下:
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);})該試?yán)趓edis 沒有打開服務(wù)狀態(tài)下執(zhí)行,得到結(jié)果如下: ————fun reject ———result reject { AbortError: Stream connection ended and command aborted. ……. ……. } 一樣得到了預(yù)期結(jié)果。思考是否每次調(diào)用都需要處理promise對(duì)象都需要寫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);})運(yùn)行得到如下結(jié)果: ————fun reject ————–fun err ———-result resolve { AbortError: Stream connection ended and command aborted. ……….. ……….. } 發(fā)現(xiàn)在發(fā)生錯(cuò)誤時(shí)去調(diào)用了reject,執(zhí)行reject后直接跳進(jìn)了catch,利用return 返回時(shí)promise對(duì)象狀態(tài)為成功態(tài)。在處理Promise對(duì)象時(shí),resolve直接獲取到了錯(cuò)誤的值。此刻若使用promise.all將因?yàn)闊o法判斷錯(cuò)誤狀態(tài),全部返回。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注