Bluebird — Смешивание each () и all ()?

#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 выполнили задание?