Недефиниран манипулатор за изпълнение на обещание

Много елементарно, изглежда, внедряване на изпълнение, базирано на Promise, не връща стойността/данните, които очаквам да видя.

Ето как очаквам този интерфейс да работи:

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

person jerome    schedule 09.06.2015    source източник
comment
това може би защото handler е анонимна функция? опитахте ли да прехвърлите нормална наименувана функция като манипулатор?   -  person Avraam Mavridis    schedule 09.06.2015
comment
Искате да регистрирате value вътре в манипулатора, а не обещанието, върнато от then   -  person Bergi    schedule 09.06.2015


Отговори (1)


Манипулаторът then ще създаде нов обещаващ обект и той ще бъде върнат, така че обещанията да могат да бъдат верижни.

Цитиране на документация на bluebird относно then,

Връща ново обещание, свързано от това обещание.


във вашия случай,

sdk.request(options)

връща обещаващ обект и има манипулатор на изпълнение, който е следният манипулатор then.

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

но манипулаторът then връща нов обект на обещание, който все още няма манипулатор на изпълнение. Ето защо _fulfillmentHandler0 е undefined.

Можете да потвърдите това по този начин

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. Това са подробности за изпълнението.


Според последния коментар,

Искам да регистрирам/проверя данните/стойността, върнати от sdk.request

Да, можете много добре да направите това с bluebird. Можете просто да tap обещанието и можете да отпечатате действителната разрешена стойност, като това

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

ще отпечата действителната разрешена стойност и можете да прикачите манипулатор then за обработка на разрешената стойност.

person thefourtheye    schedule 09.06.2015
comment
Благодаря за пояснението. Нека отделя няколко минути, за да измисля няколко неща, след което ще маркирам този отговор, ако всичко работи. - person jerome; 09.06.2015
comment
@jerome Ако искате да регистрирате/проверите действителната разрешена стойност, можете да използвате функцията tap, както показах в моя актуализиран отговор. - person thefourtheye; 09.06.2015
comment
Все още работим по този въпрос. Всъщност имам обещания на няколко нива, но вашият първоначален отговор ме насочи на правилния път, така че го отбелязвам. - person jerome; 09.06.2015
comment
възможно ли е да манипулирате с докосване и да опитате да филтрирате някои атрибути в получения обект. Вместо да го правя във функцията .then, защото имам общ манипулатор за функцията .then - person Ismail Iqbal; 26.03.2017
comment
@IsmailIqbal Можете, но моля, недейте. Добавете друг манипулатор then. - person thefourtheye; 27.03.2017