首页 > 学院 > 开发设计 > 正文

Promise初见

2019-11-11 04:21:41
字体:
来源:转载
供稿:网友

今天在网上查看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将因为无法判断错误状态,全部返回。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表