node使用promise替代回调函数

2020-06-17 06:56:08易采站长站整理

这样做的意义在于聚合结果 (Q.all),管理延时,异常恢复等等

比如说我们想要读取一个文件的内容,然后把这些内容打印出来。可能会写出这样的代码:


// 错误的写法
var outputPromise = getInputPromise().then(function (fulfilled) {
fs.readFile('test.txt', 'utf8', function (err, data) {
return data;
});
});

然而这样写是错误的,因为 function(fulfilled) 并没有返回任何值。需要下面的方式:


var Q = require('q');
var fs = require('fs');
var defer = Q.defer();

/**
* 通过 defer 获得promise
* @private
*/
function getInputPromise() {
return defer.promise;
}

/**
* 当 inputPromise 状态由未完成变成 fulfil时,调用 function(fulfilled)
* 当 inputPromise 状态由未完成变成 rejected时,调用 function(rejected)
* 将 then 返回的 promise 赋给 outputPromise
* function(fulfilled) 将新的 promise 赋给 outputPromise
* 未完成改变为 reject
* @private
*/
var outputPromise = getInputPromise().then(function (fulfilled) {
var myDefer = Q.defer();
fs.readFile('test.txt', 'utf8', function (err, data) {
if (!err && data) {
myDefer.resolve(data);
}
});
return myDefer.promise;
}, function (rejected) {
throw new Error('rejected');
});

/**
* 当 outputPromise 状态由未完成变成 fulfil 时,调用 function(fulfilled),控制台打印 test.txt 文件内容。
*
*/
outputPromise.then(function (fulfilled) {
console.log(fulfilled);
}, function (rejected) {
console.log(rejected);
});

/**
* 将 inputPromise 的状态由未完成变成 rejected
*/
//defer.reject();

/**
* 将 inputPromise 的状态由未完成变成 fulfilled
*/
defer.resolve(); // 控制台打印出 test.txt 的内容

方法传递

方法传递有些类似于 Java 中的 try 和 catch。当一个异常没有响应的捕获时,这个异常会接着往下传递

方法传递的含义是当一个状态没有响应的回调函数,就会沿着 then 往下找

没有提供 function(rejected)


var outputPromise = getInputPromise().then(function (fulfilled) { })

如果 inputPromise 的状态由未完成变成 rejected, 此时对 rejected 的处理会由 outputPromise 来完成


var Q = require('q');
var fs = require('fs');
var defer = Q.defer();
/**
* 通过defer获得promise
* @private
*/
function getInputPromise() {
return defer.promise;
}

/**
* 当 inputPromise 状态由未完成变成 fulfil 时,调用 function(fulfilled)