Promise.settle на Bluebird не разрешава с правилните стойности

Имам следния код:

return Promise.settle(matches, imgur.uploadUrl)
    .map(function (inspection) {
        if (inspection.isFulfilled()) {
            return inspection.value().data.link;
        }
        return '#';
    })

По-подробна версия на горното показва същите проблеми:

return Promise.settle(matches, function(match) { return imgur.uploadUrl(match); })
    .then(function(results) {
        return results;
    })
    .map(function (inspection) {
        if (inspection.isFulfilled()) {
            return inspection.value().data.link;
        }
        return '#';
    })

Където

  • Promise = обещанието на синята птица
  • matches = масив от връзки към изображения, извлечени от низ
  • imgur = https://github.com/kaimallea/node-imgur

Очакваното поведение е, че резултатът от .map е обещание, което се разрешава с масив от връзки към imgur, след като изображенията в оригиналния масив са качени в imgur (или „#“, в случай че качването е неуспешно по някаква причина).

Това, което се случва вместо това, е, че Promise.settle се разрешава незабавно (т.е. изглежда не изчаква качванията на imgur), а inspection.value() е URL адресът на оригиналното изображение от масива matches (което дава грешка при опит за прочетете свойството .data.link на низ).

защо се случва това Защо не се качва в imgur и не се разрешава правилно?


person Madara's Ghost    schedule 27.10.2014    source източник
comment
Бих предложил първо да опростите до Promise.settle(matches, imgur.uploadUrl).then(function(results) { ... }), за да видите дали results съдържа това, което очаквате, за да видите дали .settle() не прави това, което искате, или .map().   -  person jfriend00    schedule 27.10.2014
comment
Всъщност го направих, преди да стигна до точната версия на кода, и нямаше голяма разлика.   -  person Madara's Ghost    schedule 27.10.2014
comment
Целта на коментара ми беше да обясните дали само .settle() дава правилните резултати или не? Проблемът с .settle() ли е или с .map(). Опитвам се да разделя сложен проблем на парчета, така че човек да знае къде да търси по-нататък проблема.   -  person jfriend00    schedule 27.10.2014
comment
Когато гледам източника на Bluebird за Promise.settle(), аз само вижте, че обработва първия аргумент (очаква масив от обещания). Чудя се дали документацията на Bluebird за .settle() просто е грешна относно приемането на функция като втори аргумент, който ще обработи първия масив? Кодът е малко труден за следване, но не виждам как Promise.settle() някога използва втория аргумент (освен ако това не е правилният код, който гледам по някаква причина).   -  person jfriend00    schedule 27.10.2014
comment
@jfriend00 Публикувайте това като отговор. Преработих до Promise.settle(matches.map(imgur.uploadUrl)) и проработи. Ще подам бъг с bluebird   -  person Madara's Ghost    schedule 27.10.2014


Отговори (2)


Когато гледам източника на Bluebird за Promise.settle(), виждам само че обработва първия аргумент (очаква масив от обещания). Винаги съм го използвал просто като заместител на Promise.all(), когато искате всички обещания да бъдат изпълнени, дори ако някои имат грешки.

Чудя се дали документацията на Bluebird за .settle() просто е грешна относно приемането на функция като втори аргумент, който ще обработи първия масив? Кодът е малко труден за следване, но не виждам как Promise.settle() някога използва втория аргумент (освен ако това не е правилният код, който гледам по някаква причина).

Както посочихте, алтернатива е:

Promise.settle(matches.map(imgur.uploadUrl)).then(...)

който просто предава масив от обещания на .settle().


За информация, проверих, като създадох прост тестов случай и влязох в Promise.settle() в програмата за отстраняване на грешки, че той никога не използва втория аргумент, подаден му. Това изглежда е случай на документация, която не съответства на изпълнението. Очаквам някой да е планирал да внедри това, което е документирано, но никога не е завършил това внедряване.

person jfriend00    schedule 27.10.2014

Това наистина беше грешка в документите. Беше коригирано (реквизити към OP за заявката за изтегляне).

Документите вече показват правилното използване на .settle.

person Benjamin Gruenbaum    schedule 27.10.2014
comment
@andig да, новият начин 3.0 е към .reflect. - person Benjamin Gruenbaum; 04.11.2015
comment
Както @andig каза, че reflect не съществува на Bluebird v3.0.5, но settle изглежда работи. - person rbarriuso; 08.12.2015
comment
@rbarriuso отразява със сигурност съществува в 3.x - person Benjamin Gruenbaum; 08.12.2015
comment
Вярно. Reflect е новото селище! - person andig; 09.12.2015