欢迎您访问宜州一中 您可以登录 或注册
 
收藏本站 简繁转换
一方天地育桃李,三尺讲台竞风采             宜州区一中在宜州博物馆举行“人杰地灵读宜州”故事分享会             宜州一中举行2024届中考百日誓师大会             龙腾启新 筑梦未来 ——宜州区第一中学欢庆2024年元旦文艺晚会             走进嘉联丝厂 畅享研学之乐 ——宜州区第一中学开展研学实践活动             2023年河池市宜州区第一中学/宜州区红卫学校家庭经济困难大学新生入学资助项目发放名册(第二批)             展科技志向,圆飞行梦想 ——宜州区一中2025届举行无人机大赛             2023年河池市宜州区第一中学\红卫学校 家庭经济困难大学新生入学资助项目发放名册(第一批)             法制进校园 以法促成长 ——宜州一中举行“三姐护蕾”法治进校园活动             “英”你精彩,“语”你同行 —— 我校2025届举行英文风采大赛            

DoraCMS

您现在的位置是:首页>文档内容页

文档详情

nodeJs基础教程系列(6)——Promise 模式的Q库

doramart 2024-04-28 12:17:30 技术文档233078
Promise是一种让异步代码书写起来更舒服、更可控、优雅的模式,能够让异步操作代码像同步代码那样书写并且阅读。Q库可运行中node.js环境下,它是Promise模式的实现,下面我们来介绍它。

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/  有任何问题可在线提问。

文章评论

取消回复
登录 参与评论

评论列表(