[NODE之7]Promise

/**
 * Created by liyanq on 17/3/22.
 * promise约定,在angular中也有,尤其是在用$http服务的时候,经常用到。今天就试验下node环境下promise的实现。
 */
var fileModule = require("fs");
var sec = 0;

var promise = require("promise")

var interval = setInterval(function () {
    sec++;
}, 1);
/*----------------------------------------------------------------------------------*/
function loadOrder() {//阻塞加载
    fileModule.readFile("../public/审计助理.zip", function (err, data) {
        console.log("Order:审计助理.zip加载完成" + sec);
        fileModule.readFile("../public/审计助理2.zip", function (data) {
            console.log("Order:审计助理2.zip加载完成" + sec);
            sec = 0;
        });
    });
}
/*Order:审计助理.zip加载完成22;Order:审计助理2.zip加载完成63
 * 可以看出两个文件加载一共63ms,第一个用了22ms;第二个用了41ms*/
// loadOrder();
/*----------------------------------------------------------------------------------*/
function loadSync1() {//非阻塞加载
    fileModule.readFile("../public/审计助理.zip", function (err, data) {
        console.log("Sync:审计助理.zip加载完成" + sec);
    });
}
function loadSync2() {
    fileModule.readFile("../public/审计助理2.zip", function (data) {
        console.log("Sync:审计助理2.zip加载完成" + sec);
    });
}
/*Sync:审计助理.zip加载完成26;Sync:审计助理2.zip加载完成27
 * 可以看出两个文件加载一共27ms,第一个用了26ms;第二个用了27ms*/
// loadSync1();
// loadSync2();
/*----------------------------------------------------------------------------------*/
/*问题来了,阻塞加载能知道2个文件加载的时机,那么非阻塞呢?可能是第一个文件加载完成,也可能是第二个;
 * 是时候叫出promise来帮忙了~*/
function loadPromise1() {
    return new promise(function (resole, reject) {
        fileModule.readFile("../public/审计助理.zip", function (err, data) {
            console.log("Promise:审计助理.zip加载完成" + sec);
            resole();
        });
    });
}

function loadPromise2() {
    return new promise(function (resole, reject) {
        fileModule.readFile("../public/审计助理2.zip", function (err, data) {
            console.log("Promise:审计助理2.zip加载完成" + sec);
            resole();
        });
    });
}

// promise.all([loadPromise1(), loadPromise2()]).then(function () {
//     console.log("非阻塞加载完成" + sec);
//     clearInterval(interval);
// });
/*从结果可以看出,和loadSync1();loadSync2();用的时间差不多,但这个能准确捕捉都加载完成的时机~
 * 上面是非常理想情况,如果中间有异常怎么办呢?*/
clearInterval(interval);
var loadPromiseErr1 = new promise(function (resole, reject) {
    fileModule.readFile("../public/审计助理.zip", function (err, data) {
        err ? reject(err.toString()) :
            resole("Promise:审计助理.zip加载完成\n");
    });
});

function throwOnErr(errMsg) {
    throw new Error(errMsg);
}

var loadPromiseErr2 = new promise(function (resole, reject) {
    fileModule.readFile("../public/审计助理2.zip", function (err, data) {
        try {
            err ? throwOnErr(err.toString()) : resole("Promise:审计助理.zip加载完成");
        }
        catch (e) {
            resole(e.message);
        }
    });
});

promise.all([loadPromiseErr1, loadPromiseErr2]).then(function (resole) {
    console.log("非阻塞加载完成:\n" + resole);
}, function (reject) {
    console.log(reject);
});

var loadPromiseErrThen1 = loadPromiseErr1.then(function (resole) {
    console.log(resole);
}, function (reject) {
    console.log(reject);
});

console.log(loadPromiseErrThen1 === loadPromiseErr1);//false


/**总结
 * 1:Promise.prototype.then = function(onFulfilled, onRejected)
 * 2:执行约定的函数中resole和reject都可以传一个参数,在all里面的参数是由","隔开的~
 * 3:约定函数中,有一个进行了reject错误处理,就不会再执行onFulfilled函数了
 * 4:.then()总是返回一个新的promise,味着promise能够被chain串行链条花,这样能避免回调地狱
 * */
http://lib.csdn.net/article/nodejs/58568
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值