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

results matching ""

    No results matching ""