promise module
promise模組是Node.js使用來達成循序操縱的一個方式,該套件是實作Promises/A+ Spec的一個模組,主要目的是透過豐富的流程語意來定義非同步的流程操作。 類似的套件有像:q, when.js...等。
Installation
npm install node-promise
Sample Usage
var Promise = require("node-promise").Promise
, request = require('request')
var p = new Promise();
function step1(){
request({
url : "http://www.google.com",
method : "GET"
},
function(e,r,d){
console.log('>>1');
p.resolve(d);
});
}
step1();
p.then(function(d){
console.log('>>2');
console.log('word count:%s', d.length);
},
function(err){
console.log(err);
}
)
範例中透過p.then可以取出p.resolve的傳入值,因此,只要將傳入部分定義在非同步function中的callback中,就可以有效的擷取非同步function執行結束的行為。
Result:
>>1
>>2
word count:44887
另外,node-promise也接受defer的操作:
var Promise = require("node-promise").Promise
, request = require('request')
var defered = require("node-promise").defer();
var p = new Promise();
function step1(){
request({
url : "http://www.google.com",
method : "GET"
},
function(e,r,d){
console.log('>>1');
defered.resolve(d);
});
}
step1();
defered.then(function(result){
console.log('>>2');
console.log('word count:%s', result.length);
},
function(err){
console.log(err);
}
)
Result:
>>1
>>2
word count:44959
如果有連續操作的需要,為了要避免resolve重複被操作,可以透過下面的方式讓promise的scope限制在一個function中...
var Promise = require("node-promise").Promise
, request = require('request')
, util = require('util')
var url = 'http://odf.micloud.tw/odf/datasets'
var url_detail = 'http://odf.micloud.tw/odf/%s/field';
function step1(url){
var p = new Promise();
request({
url : url,
method : "GET"
},
function(e,r,d){
if(e) console.log(e);
p.resolve(JSON.parse(d));
});
// 因為p具備可遞延的特性,透過return p可以讓function進行.then()的連續操作
return p;
}
step1(url)
.then(function(d){
console.log('Got d:');
console.log(d);
for(var i = 0 ; i< d.length ; i++){
step1(util.format(url_detail, d[i]))
.then(function(d){
console.log(d);
});
}
})