首先参考这篇promises/A+协议的文章,搞明白什么是promise,reject,fulfill,resolve的概念。
然后下载promises/A+的实现:npm install q
下面是是一个使用q的简单例子:
var q = require("q");
var defer = q.defer();
function add(i) {
console.log(++i);
return i;
}
defer.promise.then(add).then(add);
defer.resolve(0);
这个例子中只有一个promise对象,i值会随着被解决依次向下传递,控制台会依次打印:1 2
实际上面的例子的执行如下:
var q = require("q");
var defer = q.defer();
function add(i) {
console.log(++i);
return i;
}
var promise = defer.promise
promise = promise.then(add);
promise = promise.then(add);
defer.resolve(0);
再看下面的例子:
var q = require("q");
var defer1 = q.defer();
var defer2 = q.defer();
function test(i) {
console.log(++i);
return i;
}
function testPromise(i) {
i += 100;
console.log(i);
defer2.resolve(i);
return defer2.promise;
}
defer1.promise.then(test)
.then(testPromise)
.then(test);
defer1.resolve(0);
该例子的执行结果:1 101 102
该例子中声明了两个promise对象,在执行到.then(testPromise)的时候因为返回了一个promise2对象,所以在执行下一个.then(test)方法的时候promise1会获取promise2的状态,执行最后一个.then(test)的时候,使用的值是promise2的解决值。
执行过程类似如下:
var q = require("q");
var defer1 = q.defer();
var defer2 = q.defer();
function test(i) {
console.log(++i);
return i;
}
function testPromise(i) {
i += 100;
console.log(i);
defer2.resolve(i);
return defer2.promise;
}
var promise1 = defer1.promise;
promise1 = promise1.then(test);
var promise2 = promise1.then(testPromise);
promise2 = promise2.then(test);
defer1.resolve(0);
下面是promises/A+协议中的一段话:
Promise 解决过程是一个抽象的操作,其需输入一个 promise
和一个值,我们表示为[[Resolve]](promise, x)
,如果x
有then
方法且看上去像一个 Promise ,解决程序即尝试使promise
接受x
的状态;否则其用x
的值来执行 promise
在本例子中“x”对应的就是test方法和testPromise方法的返回值。
promise的概念感觉有点像java中的Future对象,但是比Future对象功能更强大