当前位置: 首页 > 工具软件 > Q.js > 使用案例 >

nodejs promise之Q模块

郎祯
2023-12-01

Q实现promise的常用方法有7个,在不同情况下使用不同的方法,主要分为数据封装,同步封装和异步封装。

1,将数据封装成promise。

var Q = require('q');
var fs = require('fs');
var colors = require('colors');
//将数据封装成promise
//特点:封装一个数据,调用then直接得到该数据
Q('hello,world').then(function (data) {
    console.log(data);  //-->hello,world
});

2,将同步方法封装成promise---------Q.fcall()

//Q.fcall
//将同步方法封装成promise
//特点:传递一个function,返回一个promise,调用then得到方法的返回值
Q.fcall(function(){
    return 123;
}).then(function(data){
    console.log(data);  //--> 123
});

3,将异步方法封装成promise--------

(1)Q.nfcall()

//定义两个参数供下面方法用
var filename = '../public/test.xml';
var encoding = 'utf-8';

//Q.nfcall:
//将异步方法封装成promise
//特点:封闭时就得传递调用方法的参数,直接得到promise

Q.nfcall(fs.readFile,filename,encoding).then(function (data) {
    console.log(data);  //-->xml内容就不明说了,就这样的格式就对了
});

(2)Q.denodeify()

//Q.denodeify:
//将异步方法封装成promise
//特点:封装后返回一个方法,调用此方法得到promise

var File_denodeify = Q.denodeify(fs.readFile);
File_denodeify(filename,encoding).then(function(result){

        console.log(result.green)
    },function(err){

        console.log(err.toString().red);
    }
);

(3)Q.defer

//Q.defer:使用最多
//手动封装一个promise
//特点:使用deferd对象的reject方法(失败回调)、resolve方法(成功回调)、promise属性来实现自定义promise。
//(前面2个nfcal、denodeify底层应该也是用deferd实现的)

var File_deferd = function(filename,encoding){
    var deferred = Q.defer();
    fs.readFile(filename,encoding,function(err,result){
        if(err){
            deferred.reject(err.toString().red);
        }
        deferred.resolve(result);
    });

    return deferred.promise;
};
//标准的then(onFulfilled,onRejected);
//File_deferd(filename).then(function(result){

//        console.log(result.toString().blue);
//    },function(err){
//        console.log(err.toString().red);
//    }
//);

//用catch()捕获错误
File_deferd(filename).then(function(result){

        console.log(result.toString().blue);
    }).catch(function (err) {
    console.error(err);
});

(4)Q.makeNodeResolver()

//Q.makeNodeResolver:
//手动封装一个promise
//特点:和第deferd原理差不多,只不过用了deferd自带的方法省掉了我们手动实现reject方法、resolve方法
var File_makeNodeResolver = function(filename,encoding){
    var deferred = Q.defer();
    fs.readFile(filename,encoding,deferred.makeNodeResolver());
    return deferred.promise;
};

File_makeNodeResolver(filename,encoding).then(function(result){

    console.log(result.green);
},function(err){
    console.log(err.toString().red);
});

(5)Q.all()

//Q.all
//将一批promise封装成一个promise
//特点:可以并行执行一批promise,全部执行完毕后一起返回,得到的结果是一个数组
Q.all([promise1,promise2,promise3]).then();

 

 类似资料: