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); }); } })