资讯专栏INFORMATION COLUMN

Q.js中的几种创建promise对象的方法对比

fsmStudy / 2756人阅读

摘要:的意思是,从字面意思来看是用了的方法,继承原有的方法类,然后又添加了自己的某些私有方法。用来实现代码如下的意思是,从字面意思来看是用了的方法。

世界上最远的距离不是生与死的距离,而是文档就在你面前,你依然不知道这个库怎么用。

鄙人IQ不高,已经被Q.js虐了几天。查看了github上kriskowal/q的文档,现在把几种看明白了的使用方法整理记录下来,以下几种方法可以把nodejs中包含callback回调的函数转化为promise风格的代码:

Q.nfcall

Q.nfapply

Q.defer

Q.denodeify

首先设定一个使用场景:预期将一个名叫foo.txt的文件读入内存,然后将内容打印出来。

Q.nfcall

nfcall的意思是: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) // 针对读...

    chinafgj 评论0 收藏0
  • JS常用几种异步流程控制

    摘要:虽然这个模式运行效果很不错,但是如果嵌套了太多的回调函数,就会陷入回调地狱。当需要跟踪多个回调函数的时候,回调函数的局限性就体现出来了,非常好的改进了这些情况。 JavaScript引擎是基于单线程 (Single-threaded) 事件循环的概念构建的,同一时刻只允许一个代码块在执行,所以需要跟踪即将运行的代码,那些代码被放在一个任务队列 (job queue) 中,每当一段代码准...

    Barry_Ng 评论0 收藏0
  • 异步请求与Fetch

    摘要:再谈异步请求语言将任务的执行模式分成两种同步和异步。通过对象及时监听完成事件,执行事件回调函数不会堵塞程序运行。新的是异步请求的另一种方案,比起其复杂糅杂的写法,能更简洁的获取到数据。提供了对和以及其他与网络请求有关的对象的通用定义。 再谈异步请求 Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous)。 在浏览器,耗时很长...

    vibiu 评论0 收藏0
  • 一名【合格】前端工程师自检清单

    摘要:在他的重学前端课程中提到到现在为止,前端工程师已经成为研发体系中的重要岗位之一。大部分前端工程师的知识,其实都是来自于实践和工作中零散的学习。一基础前端工程师吃饭的家伙,深度广度一样都不能差。 开篇 前端开发是一个非常特殊的行业,它的历史实际上不是很长,但是知识之繁杂,技术迭代速度之快是其他技术所不能比拟的。 winter在他的《重学前端》课程中提到: 到现在为止,前端工程师已经成为研...

    罗志环 评论0 收藏0
  • 一名【合格】前端工程师自检清单

    摘要:在他的重学前端课程中提到到现在为止,前端工程师已经成为研发体系中的重要岗位之一。大部分前端工程师的知识,其实都是来自于实践和工作中零散的学习。一基础前端工程师吃饭的家伙,深度广度一样都不能差。开篇 前端开发是一个非常特殊的行业,它的历史实际上不是很长,但是知识之繁杂,技术迭代速度之快是其他技术所不能比拟的。 winter在他的《重学前端》课程中提到: 到现在为止,前端工程师已经成为研发体系...

    isaced 评论0 收藏0

发表评论

0条评论

fsmStudy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<