#javascript #node.js #promise #bluebird
#javascript #node.js #обещаю #bluebird
Вопрос:
Я только начал использовать Bluebird, и это действительно здорово! Но мне было интересно, могу ли я выполнить следующий сценарий :
У меня есть массив обещаний, и для каждого они возвращают resolve (объект), если все хорошо. но я должен проверить, обладает ли мой объект каким-либо свойством, чтобы убедиться, что все в порядке, и я должен сделать это после вызова моего promise.
И мне также нужно знать, когда будет выполнен каждый вызов. Я думал о значении int, которое увеличивается при каждом вызове each(), и когда мое значение int достигает promisesArray.length — 1, тогда это делается, но я видел Bluebird как метод с именем all (), который вызывается, когда все сделано.
Возможно ли их смешать? Например, выполните .each() в моем массиве, чтобы проверить, обладает ли все возвращаемые объекты этим свойством, а затем выполните .all (), чтобы знать, что все прошло хорошо?
Комментарии:
1. Я думаю, вам придется показать нам код, чтобы мы поняли, о чем вы на самом деле говорите и каким было бы наилучшее решение.
Ответ №1:
Вы можете использовать Promise.all
для получения всех обещаний, а затем вернуть Promise.resolve()
или Promise.reject()
, если все обещания включают свойство, необходимое для успеха:
Promise.all(promisesArray).then(function(results) {
results.forEach(function(result) {
// make the needed check for each result - for example: object.should.have.property('property')
});
});
Комментарии:
1. Что ж, моя вина, на самом деле это работает не так уж и здорово. Я использовал консоль. введите результаты обратного вызова every(), и они отобразятся только один раз. Я намеренно выполнил одно из своих обещаний, и оно не отображает никакой ошибки.
2. Возможно, мне следовало объяснить больше .. я использую mocha, это для модульного тестирования. Я использую should. js также, поэтому, когда я сказал, что проверяю свойства моего объекта, я использую object.should.have.property(‘свойство’). Но я попробую другой способ.
3.
Array.prototype.every
останавливается, как только что-то выходит из строя, а затем тринарий отклоняется. Если вы хотите отобразить ошибку, сделайте это вcatch
блоке. ВPromise.reject
вместо передачи результатов передайте то, что должно быть ошибкой.catch
Блок должен обрабатывать ошибку, напримерconsole.log('a promise failed')
.4. В 1-м
them
повторите обещания, используя.forEach
вместоevery
, и выполняйтеobject.should.have.property('property')
каждое обещание.5. Работает как по волшебству. Почему не
Array.prototype.every
выполнили задание?