/**
* 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
[NODE之7]Promise
最新推荐文章于 2024-07-08 20:31:39 发布