2015-06-09 15 views
6

Bardzo podstawowe wydaje się, że wdrożenie implementacji opartej na obietnicy nie zwróci oczekiwanej wartości/danych.Promise Reasoning Handler undefined

ten sposób spodziewam ten interfejs do pracy:

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

Oto kod w moim modelu:

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

Kiedy loguję powrót modelu, widzę to:

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

Kiedy widzę _fulfillmentHandler0: undefined który wydaje się sugerować, że nie ma obsługi wypełnienie: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

Ale obsługi spełnienie wydaje się być obecne:

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

jest to może dlatego, że 'handler' jest anonimową funkcją? czy próbowałeś przekazać normalną nazwaną funkcję jako przewodnik? –

+0

Chcesz zarejestrować wartość 'wewnątrz '** handler **, a nie obietnicę zwróconą przez' then' – Bergi

Odpowiedz

7

Handler then utworzy nowy obiekt i obietnica, że ​​zostanie zwrócony tak, że obietnice mogą być przykuty.

Cytowanie bluebird's documentation on then,

Zwraca nową obietnicę przykuty z tej obietnicy.


W twoim przypadku,

sdk.request(options) 

zwraca obiekt obietnicy i że nie ma obsługi, która jest spełnienie następujących then obsługi.

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

ale teleskopowa then zwraca nowy obiekt obietnica, która nie ma jeszcze obsługi spełnienia. Dlatego _fulfillmentHandler0 jest undefined.

Można to potwierdzić jak to

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

wypisze

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

od promise ma jeszcze żadnej obsługi spełnienia. Ale po podłączeniu modułu obsługi do niego, jak to

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

wypisze

{ _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 } 

UWAGA 1: Pojedynczy obiekt obietnica może mieć więcej niż jeden koparki do spełnienia. Dlatego powyższe wyjście pokazuje [Function], co oznacza szereg funkcji.

Uwaga 2: Nie musisz się zbytnio martwić o właściwości obiektów Obietnicy. To są szczegóły implementacji.


Jak na last comment,

Chcę log/zweryfikować dane/wartości zwracanych przez sdk.request

Tak, można zrobić bardzo dobrze, że z Bluebird. może można po prostu tap obietnica i wydrukować aktualną wartość rozwiązany, jak to

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

wypisze rzeczywistą wartość rozwiązany i można dołączyć then obsługi na przetwarzanie rozwiązany wartość.

+0

Dzięki za wyjaśnienie. Pozwól mi zająć kilka minut, aby opracować kilka rzeczy, a następnie zaznaczę tę odpowiedź, jeśli wszystko działa. – jerome

+0

@jerome Jeśli chcesz zalogować/zweryfikować rzeczywistą wartość rozwiązaną, możesz użyć funkcji "dotknij", jak pokazałem w mojej zaktualizowanej odpowiedzi. – thefourtheye

+0

Nadal pracuję nad tym. Rzeczywiście mam obietnice na głębokości kilku poziomów, ale twoja początkowa odpowiedź doprowadziła mnie do właściwego toru, więc oznaczałem to. – jerome