nodeJs基础教程系列(6)——Promise 模式的Q库
Promise 模式的Q库
Promise是一种让异步代码书写起来更舒服、更可控、优雅的模式,能够让异步操作代码像同步代码那样书写并且阅读。
Q库可运行中node.js环境下,它是Promise模式的实现,下面我们来介绍它。
通过 npm i q
安装Q库。
下面是采用回调的方式编写:
var fs = require("fs"); fs.readdir(".",function(err,rs){ fs.readFile(rs[0],function(err,f1){ console.log(f1); fs.readFile(rs[1],function(err,f2){ console.log(f2); fs.readFile(rs[2],function(err,f3){ console.log(f3); }) }) }) })
这段代码的意思是,查看当前目录下有多少文件,然后逐个读取,把读取的数据打印到终端,可笑的是,你还必须要知道到底有几个文件,如果我知道有3个,就调用三次 readFile异步函数,如果1000个,那就要......
那么,采用Q库如何改善呢?
// 导入q库 var Q = require("q"),fs = require("fs"); Q.nfcall(fs.readdir, ".").then(function(ns){ var promises = []; ns.forEach(function(filename){ promises.push(Q.nfcall(fs.readFile, filename,"utf8")); }) Q.all(promises).then(function(results){ console.log(results); }) })
通过Q.nfcall
方法调用异步函数,返回一个 promise
对象,promise
对象具有一个方法then
,可以得到运行结果。
这里的 var promises = [];
变量用于储存promise数组,把这个参数加入Q.all
方法里,会得到一个promise对象,调用then方法会得到一个数组,这个数组就是所有 promises的运行结果。
一切都围绕promise对象
,它有一个then方法用于返回回调函数结果,还有一个fail
函数,用于返回异常对象,then 和 fail 不会同时被调用,就好比一个普通函数,如果抛出异常就不会有返回值一样。
举例,修改之前代码:
var Q = require("q"),fs = require("fs"); Q.nfcall(fs.readdir, "no path") .then(function(ns){ var promises = []; ns.forEach(function(filename){ promises.push(Q.nfcall(fs.readFile, filename,"utf8")); }) Q.all(promises).then(function(results){ console.log(results); }) }) .fail(function(err){ console.log(err); })
运行结果是:
{ [Error: ENOENT, readdir 'no path'] stack: 'Error: ENOENT, readdir \'no path\'\n at Error (native)', errno: -2, code: 'ENOENT', path: 'no path' }
说明调用的是 fail函数,而不是then,说明 then 代表无异常情况下的返回值,fail表示抛出的异常,如果过程中有任何异常,promise.then 的函数都不会被调用,而是会调用fail,表示抛出异常。
详细API可参看 http://documentup.com/kriskowal/q/ 有任何问题可在线提问。
相关文章
- [转]让你的 Node.js 应用跑得更快的 10 个技巧
- Node.js API实例——Node.js 控制台
- Node.js 入门
- nodeJs基础教程系列(3)——建立githubs项目
- nodeJs基础教程系列(1)——安装Node.js
- nodeJs基础教程系列(6)——Promise 模式的Q库
- Atom 更为先进的文本代码编辑器 - 由 Github 打造的下一代编程开发利器
- bootstrap 3.3 模态框垂直居中问题
- js字符串操作
- js鼠标滑轮滚动事件绑定(兼容主流浏览器)
- 视频:Windows 安装FTP服务 (基于Windows2008 IIS配置FTP站点 )
- 屌丝为什么找不到女朋友