摘要:的意思是,从字面意思来看是用了的方法,继承原有的方法类,然后又添加了自己的某些私有方法。用来实现代码如下的意思是,从字面意思来看是用了的方法。
世界上最远的距离不是生与死的距离,而是文档就在你面前,你依然不知道这个库怎么用。
鄙人IQ不高,已经被Q.js虐了几天。查看了github上kriskowal/q的文档,现在把几种看明白了的使用方法整理记录下来,以下几种方法可以把nodejs中包含callback回调的函数转化为promise风格的代码:
Q.nfcall
Q.nfapply
Q.defer
Q.denodeify
首先设定一个使用场景:预期将一个名叫foo.txt的文件读入内存,然后将内容打印出来。
Q.nfcallnfcall的意思是:Nodejs Function Call,从字面意思来看是用了javascript的call方法,继承原有的方法(类),然后又添加了自己的某些私有方法。用Q.nfcall来实现代码如下:
var fs_readfile=Q.nfcall(fs.readFile,"foo.txt","utf-8"); fs_readfile.then(readA); function readA(data){ console.log(data) }Q.nfapply
nfapply的意思是:Nodejs Function Apply,从字面意思来看是用了javascript的apply方法。与nfcall相似。用Q.nfapply来实现代码如下:
var fs_readfile=Q.nfapply(fs.readFile,["foo.txt","utf-8"]); fs_readfile.then(readA); function readA(data){ console.log(data) }Q.defer
用Q.defer来实现的代码如下:
var promise=function(){ var defer=Q.defer(); fs.readFile("foo.txt","utf-8",defer.makeNodeResolver()); return defer.promise; } function readA(data){ console.log(data); } promise().then(readA);Q.denodeify
以上三种方法,都存在一个麻烦的问题:如果我的需求场景变成了首先读入foo.txt文件,然后根据文件中的内容来决定是否调用另一个文件,并且打印出另一个文件的内容。这种场景我们常常会在数据库查找中用到——先查询到某个id,然后在另一个库中根据这个id查到其他某些字段的数据。这就涉及到链式调用。
上面的三种方法,如果在链式调用中我不想让代码变得冗余,写一堆readB、readC……的方法(有些时候甚至究竟链式调用会经历多少步,即要使用多少个then我们事先都不清楚,需要根据获得的数据来动态决定)。
在这种情况下,使用Q.denodeify最合适:
var fs_readfile=Q.denodeify(fs.readFile) fs_readfile("foo.txt","utf-8") .then(readA).then(readA) function readA(data){ console.log(data); //只要在这里返回新的promise对象,就能把异步执行结果返回给下一个then()方法 return fs_readfile("foo2.txt","utf-8"); }
从上面的分析看到,我们还能想到一些实用的场景,比如:需要批量下载一批图片(图片数量和文件名都不确定)之后,再做批量上传,那么只需要写两个不同的then方法和两个不同的promise实例,即可用链式调用的方式完成任务。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/78333.html
摘要:臆想的针对读取到的内容进行操作,比如打印文件内容臆想中,读取文件是有返回值的,将返回值,即文件内容,赋给一个变量,然后决定对读取到的内容进行相应的操作,例如打印文件中的内容。 臆想的 let fs = require(fs) function readFile(filename){ ... } let content = readFile(config.js) // 针对读...
摘要:虽然这个模式运行效果很不错,但是如果嵌套了太多的回调函数,就会陷入回调地狱。当需要跟踪多个回调函数的时候,回调函数的局限性就体现出来了,非常好的改进了这些情况。 JavaScript引擎是基于单线程 (Single-threaded) 事件循环的概念构建的,同一时刻只允许一个代码块在执行,所以需要跟踪即将运行的代码,那些代码被放在一个任务队列 (job queue) 中,每当一段代码准...
摘要:再谈异步请求语言将任务的执行模式分成两种同步和异步。通过对象及时监听完成事件,执行事件回调函数不会堵塞程序运行。新的是异步请求的另一种方案,比起其复杂糅杂的写法,能更简洁的获取到数据。提供了对和以及其他与网络请求有关的对象的通用定义。 再谈异步请求 Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous)。 在浏览器,耗时很长...
摘要:在他的重学前端课程中提到到现在为止,前端工程师已经成为研发体系中的重要岗位之一。大部分前端工程师的知识,其实都是来自于实践和工作中零散的学习。一基础前端工程师吃饭的家伙,深度广度一样都不能差。 开篇 前端开发是一个非常特殊的行业,它的历史实际上不是很长,但是知识之繁杂,技术迭代速度之快是其他技术所不能比拟的。 winter在他的《重学前端》课程中提到: 到现在为止,前端工程师已经成为研...
摘要:在他的重学前端课程中提到到现在为止,前端工程师已经成为研发体系中的重要岗位之一。大部分前端工程师的知识,其实都是来自于实践和工作中零散的学习。一基础前端工程师吃饭的家伙,深度广度一样都不能差。开篇 前端开发是一个非常特殊的行业,它的历史实际上不是很长,但是知识之繁杂,技术迭代速度之快是其他技术所不能比拟的。 winter在他的《重学前端》课程中提到: 到现在为止,前端工程师已经成为研发体系...
阅读 3322·2021-11-25 09:43
阅读 3007·2021-10-15 09:43
阅读 1964·2021-09-08 09:36
阅读 2917·2019-08-30 15:56
阅读 741·2019-08-30 15:54
阅读 2683·2019-08-30 15:54
阅读 2971·2019-08-30 11:26
阅读 1236·2019-08-29 17:27