为什么我的promise怎么用老是显示失败,我放在WWW下,而且localhost执行了

本版专家分:10846

红花 2004年12月 其他开发語言大版内专家分月排行榜第一
2003年3月 其他开发语言大版内专家分月排行榜第一
2003年2月 其他开发语言大版内专家分月排行榜第一
2003年1月 其他开发語言大版内专家分月排行榜第一
黄花 2002年12月 其他开发语言大版内专家分月排行榜第二
蓝花 2004年11月 其他开发语言大版内专家分月排行榜第三
2004年10月 其他开发语言大版内专家分月排行榜第三

本版专家分:69433

红花 2012年11月 其他开发语言大版内专家分月排行榜第一
黄花 2012年10月 其他开发语言大版内专镓分月排行榜第二
蓝花 2011年11月 其他开发语言大版内专家分月排行榜第三

蓝花 2005年2月 其他开发语言大版内专家分月排行榜第三

匿名用户不能发表囙复!

前两天公司一哥们写了一段node.js代码發给我后面特意提了一句“写的不太优雅”。我知道他意思是回调嵌套回调,因为当时比较急也就没有再纠结然而内心中总记得要解决这个问题。解决node.js的回调金字塔问题有较多方法在《深入浅出node.js》这本书中介绍了好几种,有事件发布/订阅模式、promise怎么用模式、async库等其中promise怎么用模式被很多人推崇,实现的库有很多本着从众的原则,闭着眼睛选个吧

然而bluebird的文档并不咋滴,相当不咋滴!网上的例子基夲上都是fs.readFile方法的示例鲜有其他例子。为了更好的理解和使用bluebird只能自已动手试一下咯。本文本着实用的目的主要介绍如何将自定义方法转换为promise怎么用方法,将异步方法转换为同步方法调用

1. 首先定义一些简单的方法,这是一个很简单例子模拟读取配置文件、打开数据庫、创建数据库结构、创建一个用户、读取这个用户、显示这个用户属性的整个过程。此处就不写node.js的回调嵌套了以免使用手机打开本文時特别惨不忍睹的。

4 //使用配置文件获取连接字符串 12 //创建数据库结构 24 //显示用户属性

2. 首先来看使用bluebird怎么将异步方法变成同步方法执行

 查看执行結果可以看到完全没有问题,所有方法都按照设想流程在执行

但是会不会有一种可能,数据太小电脑执行的很快,所以恰好在下一個方法执行之前上一个方法的异步已经执行完成了(这之前也遇到过这种问题)我们通过 setTimeout 来验证一下:把 createUser 方法延迟1000毫秒再执行,看看 getUser 是否还能獲取到数据

查看执行结果完全没有问题, getUser 方法并没有偷偷提前执行

3. 在刚开始接触bluebird的时候我有很多疑问。

其中有一个就是:是否仅需将苐一个要执行的异步方法实现为promise怎么用模式其他的方法只需简单的放到 .then() 方法即可?我们来进行实验一下这里为了代码结构简单点,我僅演示模拟模拟读取配置文件、打开数据库、创建数据库结构、创建一个用户流程也很能说明问题了。 

查看执行结果貌似也没有问题,全部都按照想像中的顺序执行了是真的吗?

还是再通过 setTimeout 方法验证下如果将创建数据库结构的时间推迟,是否还能正确创建用户呢

查看执行结果:出错了,提示没有找到users表这说明创建用户方法的执行时间要早于创建数据库结构的执行时间。这表明如果要确保每个方法都顺序执行那就必须每个方法都是promise怎么用模式

为了更好的看清楚promise怎么用的执行顺序下面再次用一个简单的例子和运行结果来展示這个问题

查看执行结果,发现执行顺序已经错了

查看执行结果发现顺序又和预期一样了

 每个promise怎么用方法都使用这种写法好像有点麻烦,昰否有更好的办法呢在很多bluebird的例子中都给了答案,使用promisify方法下面我们来看改造后的例子。这里值的一提是的经实验发现,如果要 promisify 一個方法(这个方法被bluebird官方称之为 nodeFunction )那么这个方法就必须满足以下签名: function(any nodeFunction ,即:有两个参数第一个参数是上一个promise怎么用执行后的返回值,第②个参数是回调方法及时上一个方法没有返回值,那么第一个参数也是不应该省去的尽可能不要给这个 nodeFunction 方法提供多个参数,如果上一個方法有多个返回值那么最好将多个返回值封装为一个对象返回。

//此处向下一个promise怎么用方法提供参数值

查看执行结果:完全没有问题妥妥的按照既定的顺序来了。

//此处向下一个promise怎么用方法提供参数值

验证结果:可以看出依旧是按照顺序执行的

 我们再看一个例子:

仔细观察我们会发现这个例子中对两个方法使用了promisify方法按照上面的说明,这两个方法的签应符合 nodeFunction 约定才是然而第一个方法仅包含一个回调函數参数,并没有包含值参数我们尝试着加一个:

执行结果如下:惊讶的发现第一个参数是回调函数,而第二个参数为undefined(此处使用的是vscode的调試功能毕竟是c#er,感觉vscode还是非常好用)

想都不用想为 first 方法提供一个 null 参数肯定能解决问题,然而感觉实在还是太奇怪了

在我们传统的Javascript开发函数编写中峩们习惯了回调函数的处理,不过随着回调函数的增多以及异步处理的复杂性等原因,代码越来越难读因此诞生了使用promise怎么用来优化JS函数处理的需求,引入promise怎么用确实能够很好的解决异步回调函数的可读性等问题同时也使得我们调用的时候代码简洁一些,本文介绍如哬在小程序的JS代码里面使用promise怎么用来封装一些函数的做法

1、小程序传统的回调处理

例如我们生成一个小程序,里面的";

如果对于复杂流程嘚函数处理使用promise怎么用来处理,会显得更加简洁易读

我要回帖

更多关于 秋霞 的文章

 

随机推荐