2015-06-09 20 views
6

非常基本的,似乎基於Promise的實現的實現沒有返回我期望看到的值/數據。Promise履行處理程序undefined

這是我很期待這個接口的工作:

sdk.request(options) => Promise~Response → Object (JSON) 

這裏是我的模型代碼:

return sdk.request(options).then(function (value) { 
    return value; 
}); 

當我登錄了該模型的回報,我看到這一點:

{ 
    _bitField: 0, 
    _fulfillmentHandler0: undefined, 
    _rejectionHandler0: undefined, 
    _progressHandler0: undefined, 
    _promise0: undefined, 
    _receiver0: undefined, 
    _settledValue: undefined 
} 

當我看到那個_fulfillmentHandler0: undefined似乎暗示沒有履行處理程序:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

但履行處​​理器似乎是存在:

return sdk.request(options).then(function (value) { 
    // fulfillment handler, right? 
    return value; 
}); 
+0

這可能是因爲'handler'是一個匿名函數?你是否試圖傳遞一個正常的命名函數作爲處理程序? –

+0

你想記錄**處理程序**內的'value',而不是'then'返回的承諾 – Bergi

回答

7

then處理程序將創建一個新的承諾的對象,並且將返回,這樣的承諾可以鏈接。

引用bluebird's documentation on then

返回從這個諾言鏈一個新的承諾。


在你的情況,

sdk.request(options) 

返回一個承諾對象,並具有履行處理程序,它是以下then處理程序。

.then(function (value) { 
    return value; 
}); 

then處理程序返回一個新的承諾的對象,它不具有履行處理呢。這就是爲什麼_fulfillmentHandler0undefined

可以證實這一點像這樣

var promise = require("bluebird").resolve(); 
console.log(promise); 

將打印

{ _bitField: 268435456, 
    _fulfillmentHandler0: undefined, 
    _rejectionHandler0: undefined, 
    _progressHandler0: undefined, 
    _promise0: undefined, 
    _receiver0: undefined, 
    _settledValue: undefined } 

因爲promise沒有履行處理呢。但是,當您將一個處理程序,就像這樣

var promise1 = promise.then(function() {}) 
console.log(promise); 

將打印

{ _bitField: 268435457, 
    _fulfillmentHandler0: [Function], 
    _rejectionHandler0: undefined, 
    _progressHandler0: undefined, 
    _promise0: 
    { _bitField: 0, 
    _fulfillmentHandler0: undefined, 
    _rejectionHandler0: undefined, 
    _progressHandler0: undefined, 
    _promise0: undefined, 
    _receiver0: undefined, 
    _settledValue: undefined }, 
    _receiver0: undefined, 
    _settledValue: undefined } 

注1:單個承諾對象可以有多個實現處理程序。這就是爲什麼上面的輸出顯示[Function],這意味着一系列功能。

注2:您不必太擔心Promise對象的屬性。這些是實現細節。


按照該last comment

我想記錄/驗證由sdk.request

返回的數據/值對,可以很好地做到這一點與藍鳥。你可以簡單地tap的承諾,你可以打印解決實際價值,這樣

return sdk.request(options).tap(console.log); 

將打印的實際解析值,你可以附加一個then處理程序處理解析值。

+0

感謝您澄清。讓我花幾分鐘來解決一些事情,然後我會標記這個答案,如果我一切正常。 – jerome

+0

@jerome如果你想記錄/驗證實際解析的值,你可以使用'tap'功能,就像我在我的更新答案中所示。 – thefourtheye

+0

依然在努力。我實際上已經承諾了幾個級別的深度,但是您的初始答案讓我走上了正確的軌道,因此將其標記出來。 – jerome