node使用promise替代回调函数

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

// 当 promise 状态变成 fulfilled 时,调用此函数
}, function (rejected) {
// 当 promise 状态变成 rejected 时,调用此函数
}, function (progress) {
// 当返回进度信息时,调用此函数
});

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
*/