使用Promise的感受
起因
团队新建项目的时候,打算升级服务器端和客户端的技术栈,所以就有了这个糟心并收获颇丰的服务器搭建的过程
架子
Express + JWT+ Mongoose + ioredis + request (Promise)
感受
- 刚开始的时候 因为使用过更高版本的async await,就会觉得promise非常的别扭,比自己用async库更别扭,内心是极度的排斥
- 在强大内心的驱动下,在大脑中残留对promise的记忆下,继续深入接触promise, 浏览bluebird库的API。一点点的写demo实例去体会promise的设计初衷
- mongoose, ioredis, request 都可以支持promise化,所以没有遇到太大的问题
- 接下来就是比较糟心的过程了
- 虽然使用promise.then方法非常的方便,但是由于没有了解到规范的异常处理,对于在promise中途出现错误应该如何处理,处于一个未知的状态,内心有些交集
- 还要在使用mongoose, request的时候,处理返回结果的方式也有些变化,request虽然支持了promise,但是我觉得支持的不是那么的完美。查看stack overflow后,发现要把原来的xxx方法替换成xxxAsync方法.
- mongoose 查询或者创建的数据,通过return 返回到下一个then(function(result){})中。 就像async.waterfall(…function(info,cb){})一样。 了解了之后,也感觉到了promise还是有那么一点不错的地方。
- 说到头来 其实最痛苦的过程 就是要改变原来的习惯,去使用新的方法。
- 稍后自己会把代码整理成可以分享的 放到github上 也希望对其他人有所帮助。
我在使用Promise时遇到了个最头疼的问题,比如在使用mongoose时,有三个异步,假设为P1、P2、P3,顺序是P1=>P2=>P3,我通过在P1.then里面return P2的形式进行书写,当我在P3的then里需要使用到P2和P1的结果时,我不知道改怎么办了。。。,最后我不得不async await来写,突然感觉太爽了!不过Promise的这个问题就一直被搁置了,你有好的解决办法吗?
我们团队是直接弃用then方法的,就直接使用async/await了,异常处理就try catch 毕竟Promise.then也不太友好 对于很多callback库,其实不用自己手动用Bluebird的promisify去转换,而是去找新的库来替代,这些库都有自己的单元测试,比较稳定也比较友好。
@ImSiegeLion 在P2 resolve的时候把P1 P2的结果写到数组里,然后一起resolve
@Bingmang 如果是我自己封装的Promise的话,可以通过这种方式来解决,但是我使用的是mongoose,它已经把Promise封装好了,我无法(不知道如何)去控制resolve和reject,所以很无奈。。。
@ImSiegeLion 直接用async/await呀!!!
@Bingmang 在用。但是Promise的这个问题一直没解决,心里有个坎。。。
@Bingmang 另外,使用try/catch也感觉很不优雅,有些错误捕获到了,但是错误对象却是空的
@ImSiegeLion 哈哈,其实有了async/await promise的这个直接可以弃用的,你可以这样
function findSomething() {
let result1, result2
conn.query({})
.then((result) => {
result1 = result
})
}
在外面一层申明变量保存一下就好了
看到你们的回复,感觉promise 在实际的开发中 还是显得不是那么的友好😄。 起初我也是想用async/await的。一步一步来吧,也许用过一段时间后,会有另外一番感受。
@ImSiegeLion 不会的,async函数抛出异常是async函数段里reject(err)的时候抛出的,错误对象是空的是因为reject不对
我刚开始使用async/await的时候也觉得try catch 很不优雅,但至少比Promise.then().catch() 好多了……
@Bingmang 哈哈哈,原来大家都是用全局变量来实现的,唉,凑合来吧,至少能用😆
@NextZeus 最近我学习到了JWT,但是网上好多都是基础的介绍和比较偏理论的东西,你讲解下JWT在实际的开发中的应用吗?另外我理解的JWT比较适合服务端对服务端,因为需要保存加密用的密钥,如果是前端对后端,那前端是如何在请求发送前对header和payload进行加密的呢?
不是很懂,根据我的经验,当你声明一个方法为async的时候,调用这个方法返回的不就是一个promise对象么?为什么楼上的好像把async/await和promise完全分开了
@ImSiegeLion 你理解错了吧,jwt 是服务器生成 token 后,客户端负责保存,服务器负责验证就好了(这里有个问题,服务器无法控制,如果服务器保存一份,这个和 session 差不多了吧)
@ImSiegeLion https://github.com/NextZeus/helloexpress4 这是我自己写的一个express + jwt的demo 很简单的用了一下
@enternoder @NextZeus 根据那个Demo对JWT加深了些理解,我之前以为是前端发请求前,要把将发送的数据加密成JWT的格式,服务器收到后再根据header和payload再次加密,然后比对Signature。。。这么理解确实存在不小的偏差。。。这种对称的加密也就毫无意义了。。。