文档章节

node学习----Promise 初见

johnL
 johnL
发布于 2016/10/11 09:59
字数 582
阅读 27
收藏 0

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

© 著作权归作者所有

johnL
粉丝 2
博文 20
码字总数 10141
作品 0
成都
程序员
私信 提问
用Nodejs完成自己的个人博客

开始这个个人小项目已经有一段时间了,一直断断续续的,直到今天总算是初见雏形,所以就很想和大家分享一下实现的过程。首先这个的初衷就是学习nodejs,看了几天的书,自己就照着书上的代码来...

简心豆
2017/06/03
0
0
捕获未处理的Promise错误

译者按: 通过监听unhandledrejection事件,可以捕获未处理的Promise错误。 原文: Tracking unhandled rejected Promises 译者: Fundebug 为了保证可读性,本文采用意译而非直译,并且对源代...

Fundebug
2017/10/17
0
0
JavaScript 异步

JavaScript怎么使用循环代替(异步)递归 问题描述 在开发过程中,遇到一个需求:在系统初始化时通过http获取一个第三方服务器端的列表,第三方服务器提供了一个接口,可通过分页形式获取列表。...

掘金官方
2018/01/02
0
0
ES6-7

JavaScript Promise 迷你书(中文版) 超详细介绍promise的gitbook,看完再不会promise...... 本书的目的是以目前还在制定中的ECMAScript 6 Promises规范为中心,着重向各位读者介绍JavaScr...

掘金官方
2018/01/05
0
0
Node.js最新Web技术栈(2016年4月)

Node.js最新Web技术栈(2016年4月) 上一次的发布的是精华 Node.js最新Web技术栈(2015年5月),感谢大家喜爱,值此koa2.0发布后,决定再次升级技术栈 Node.js是比较简单的,只有你有前端js基...

i5ting
2016/04/01
5.9K
10

没有更多内容

加载失败,请刷新页面

加载更多

Oracle SQL语法实例合集

如需转载请注明出处https://my.oschina.net/feistel/blog/3052024 目的:迅速激活Oracle SQL 参考:《Oracle从入门到精通》 ------------------------------------------------------------......

LoSingSang
59分钟前
1
0
增加 PostgreSQL 服务进程的最大打开文件数

https://serverfault.com/questions/628610/increasing-nproc-for-processes-launched-by-systemd-on-centos-7 要在systemd的配置里加才行...

helloclia
今天
2
0
组合模式在商品分类列表中的应用

在所有的树形结构中最适合的设计模式就是组合模式,我们看看常用商品分类中如何使用。 先定义一个树形结构的商品接口 public interface TreeProduct { List<TreeProduct> allProducts(...

算法之名
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部