2017-01-05 40 views
2

我寫測試代碼爲Bluebird在Node.js的是這樣的:爲什麼結果不是我期望的Nodejs承諾?

var Promise = require(‘bluebird’) 
var obj = { 
     func1: function() { 
       return ‘foo’ 
     }, 
     func2: function() { 
       return ‘bar’ 
     } 
} 
console.log("==================================") 
Promise.promisifyAll(obj) 

obj.func1Async().then(function (result) { 
     console.log(result) 
}) 

我所期待的是打印的「富」,但實際上沒有輸出。 有什麼問題嗎?

+0

Ovidiu的答案將解決您的問題:-)另外,您可以:'obj.func1Async()。then(console.log)'並避免一些樣板代碼。 – Sergeon

+0

我不明白,我認爲是 'obj.func1Async()'返回一個承諾,並可以調用then方法,然後傳遞返回值「foo」。像fs:'fs.readFileAsync('filename')。then(function(content){console.log(content)})' 有什麼區別? – TreeCatCat

回答

3

東張西望了一會兒,似乎藍鳥promisify工作節點式的功能,這些功能如下:

  • 可以接受第一
  • 最後一個參數0..N參數始終是一個回調
  • 需要使用(錯誤,數據)參數按順序調用回調。

所以你的情況,代碼應該是:

var obj = { 
    func1: function (cb) { // note if you add params they need to be before cb and always passed when invoking the func1Async version 
    cb(null, 'foo'); // null => no error 
    }, 
    func2: function (cb) { 
    cb(null, 'bar'); // null => no error 
    } 
} 

然後,它的工作原理。醜 - 但它應該是這樣。

+0

我不明白,我認爲是obj.func1Async()返回一個承諾,並可以調用then方法,然後傳遞返回值「foo」。 like fs: fs.readFileAsync('filename')。then(function(content){ console.log(content) }) 有什麼區別? – TreeCatCat

+1

不確定你的意思..但是在我的回答中定義的'obj'符合藍鳥希望能夠給予你期望的承諾(如果你看fs.readFile函數實現,你會看到它與我提到的條件有類似的簽名)。所以如果你想使用藍鳥來獲得相同的結果,你必須使你的函數實現符合這些條件。如果你只是想要一個函數的承諾,你可以自己做'var func1Async =()=> new Promise(res => res(func1()))' –

+0

感謝哥們。我知道 – TreeCatCat