2016-07-31 109 views
0

我寫了下面的代碼:爲什麼'promisify'會導致節點忽略一個函數?

var express = require('express'); 
var app = express(); 
var Promise = require('bluebird'); 
var counter = {}; 
counter.num = 0; 

function incr(counter) { 
    counter.num = counter.num + 1; 
} 

app.get('/check', function(req, res) { 
    Promise.promisify(console.log)(counter.num) 
     .then(Promise.promisify(incr)(counter.num)) 
     .then(console.log(counter.num)); 
    res.end("OK"); 
}); 

app.listen(4000); 

我期待下面的操作發生synchronically: 1.打印counter.num(= 0) 2.增量counter.num 3.打印新的計數器.nu​​m(= 1)

這是我得到:

0 [功能]

爲什麼沒有操作2發生?爲什麼我會在控制檯中獲得「[功能]」?

回答

0

promisify用於異步功能。 console.log是一個同步功能。 Bluebird期望函數被promisified具有最後一個參數的回調函數。

我看不出有什麼理由可能希望在您的問題情況下使用承諾。

1

您的情況不適用於Promise.promisify()

假設你正在使用藍鳥,藍鳥隨後的Promise.promisify()預計如下:

  1. 你promisifying必須採取一個回調,因爲它最後一個參數(通常被稱爲Node.js的異步調用約定)的功能。
  2. 當函數完成其操作時,必須使用參數(err, data)調用該回調。
  3. 當函數成功並且結果在data參數中傳遞時,err值必須是falsey。當出現錯誤時,err值必須真實,然後err是錯誤值。

您對.promisify()的使用不符合以上任何一種條件。

由於承諾的目的是跟蹤或協調異步操作,所以似乎你甚至不應該對這個特定的代碼使用承諾。因爲你所有的counter操作都是同步的,你可以這樣做:

app.get('/check', function(req, res) { 
    console.log(counter.num); 
    incr(counter); 
    console.log(counter.num); 
    res.end("OK"); 
}); 
相關問題