node使用promise替代回调函数(3)
当 function(fulfilled) 或者 function(rejected) 抛出异常时,那么 outputPromise 的状态就会变成 rejected
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) 和 function(rejected) 通过抛出异常将 outputPromise 的状态由
* 未完成改变为 reject
* @private
*/
var outputPromise = getInputPromise().then(function (fulfilled) {
throw new Error('fulfilled');
}, function (rejected) {
throw new Error('rejected');
});
/**
* 当 outputPromise 状态由未完成变成 fulfil 时,调用 function(fulfilled)。
* 当 outputPromise 状态由未完成变成 rejected, 调用 function(rejected)。
*/
outputPromise.then(function (fulfilled) {
console.log('fulfilled: ' + fulfilled);
}, function (rejected) {
console.log('rejected: ' + rejected);
});
/**
* 将 inputPromise 的状态由未完成变成 rejected
*/
defer.reject(); // 控制台打印 rejected [Error:rejected]
/**
* 将 inputPromise 的状态由未完成变成 fulfilled
*/
//defer.resolve(); // 控制台打印 rejected [Error:fulfilled]
当 function(fulfilled) 或者 function(rejected) 返回一个 promise 时,outputPromise 就会成为这个新的 promise.
这样做的意义在于聚合结果 (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 的内容
内容版权声明:除非注明,否则皆为本站原创文章。
