node使用promise替代回调函数(2)
Promise 法则有两部分必须分离:
1. then() 总是返回一个新的 promise,每次你调用它,它不管回调做什么,因为 .then() 在回调被调用之前已经给了你一个承诺 promise,回调的行为只影响承诺 promise 的实施,如果回调返回一个值,那么 promise 将使用那个值,如果这个值是一个 promise,返回这个 promise 实施后的值给这个值,如果回调抛出错误,promise 将拒绝错误
2. 被 .then() 返回的 promise 是一个新的 promise ,它不同于那些 .then() 被调用的 promise,promise 长长的链条有时会好些隐藏这个事实,不管如何,每次 .then() 调用都会产生一个新的 promise,这里必须注意的是你真正需要考虑的是你最后调用 .then() 可能代表失败,那么如果你不捕获这种失败,那么容易导致你的错误 exception 消失
来看一个利用 q 来处理这种问题的简单例子:
var Q = require('q');
var defer = Q.defer();
/**
* 获取初始 promise
* @private
*/
function getInitialPromise() {
return defer.promise;
}
/**
* 为 promise 设置三种状态的回调函数
*/
getInitialPromise().then(function (success) {
console.log(success);
}, function (error) {
console.log(error);
}, function (progress) {
console.log(progress);
});
defer.notify('in progress'); // 控制台打印 in progress
defer.resolve('resolve'); // 控制台打印 resolve
defer.reject('reject'); // 没有输出。promise 的状态只能改变一次
promise 的传递
then 方法会返回一个 promise,在下面这个例子中,我们用 outputPromise 指向 then 返回的 promise。
var outputPromise = getInputPromise().then(function (fulfilled) {
}, function (rejected) {
});
现在 outputPromise 就变成了受 function(fulfilled) 或者 function(rejected) 控制状态的 promise 了。直白的意思就是:当 function(fulfilled) 或者 function(rejected) 返回一个值,比如一个字符串,数组,对象等等,那么 outputPromise 的状态就会变成 fulfilled。
在下面这个例子中,我们可以看到,当我们把 inputPromise 的状态通过 defer.resovle() 变成 fulfilled 时,控制台输出 fulfilled.
当我们把 inputPromise 的状态通过 defer.reject() 变成 rejected,控制台输出 rejected
var Q = require('q');
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 的状态由
* 未完成改变为 fulfilled
* @private
*/
var outputPromise = getInputPromise().then(function (fulfilled) {
return 'fulfilled';
}, function (rejected) {
return 'rejected';
});
/**
* 当 outputPromise 状态由未完成变成 fulfil 时,调用 function(fulfilled),控制台打印 'fulfilled: fulfilled'。
* 当 outputPromise 状态由未完成变成 rejected, 调用 function(rejected), 控制台打印 'rejected: rejected'。
*/
outputPromise.then(function (fulfilled) {
console.log('fulfilled: ' + fulfilled);
}, function (rejected) {
console.log('rejected: ' + rejected);
});
/**
* 将 inputPromise 的状态由未完成变成 rejected
*/
defer.reject(); // 输出 fulfilled: rejected
/**
* 将 inputPromise 的状态由未完成变成 fulfilled
*/
//defer.resolve(); // 输出 fulfilled: fulfilled
内容版权声明:除非注明,否则皆为本站原创文章。
