2015-05-18 2 views
11

У меня есть множество обещаний, каждое обещание - это отказ от веб-сайта. Большинство из них разрешают, но могут быть случаи, когда один или два отклоняют, например. сайт не работает. Я хочу проигнорировать отклоненные обещания и сохранить ценности только обещаний, которые были решены.Сохраняйте значения только из обещаний, которые разрешают и игнорируют отклоненные

Promise.all не для этого случая, поскольку для этого требуются все обещания.

Promise.some() не то, что я хочу, так как не знаю заранее, сколько обещаний разрешится.

Promise.any() таким же, как Promise.some() с графом 1.

Как этот случай решается? Я использую Bluebird implementation.

+0

если вы может добавить тайм-аут, чтобы получить, они должны все в конечном итоге «решить». Поэтому мне интересно, хотите ли вы периодически тестировать и видеть, сколько из них разрешено? – Dinesh

+0

@ Dinesh хорошо, это не надежное решение, а что, если оно не работает, если ресурс не работает в течение нескольких часов? Должно быть более надежное решение. –

ответ

15

Конечно вещь, к счастью для вас Bluebird уже делает это:

Promise.settle(arrayOfPromises).then(function(results){ 
    for(var i = 0; i < results.length; i++){ 
     if(results[i].isFulfilled()){ 
      // results[i].value() to get the value 
     } 
    } 
}); 

Вы также можете использовать новую reflect вызов:

Promise.all(arrayOfPromises.map(function(el){ 
    return el.reflect(); 
})).filter(function(p){ 
    return p.isFulfilled(); 
}).then(function(results){ 
    // only fulfilled promises here 
}); 
+0

thx, уладил работу. –

+0

@Benjamin Gruenbaum - Проблема с этим (Promise.reflect()) заключается в том, что вы не можете использовать свойства объекта prom (например, objectname.itsproperty) в блоке then. –

0

это так же, как решение @Benjamin, но с более элегантным массива манипуляции:

этот код будет игнорировать результат отклоненного обещания, поэтому вы можете выполнить 10 обещаний и получить результаты в виде массива из 3 элементов:

Promise.settle(arrayOfPromises).then(function(results){ 
    return results.filter(function (result) { 
       return result.isFulfilled(); 
      }).map(function (result) { 
       return result.value(); 
      }); 
}).then(function(results){ 
    console.log("here you go:", results); 
}); 

здесь будет игнорировать отклоненное обещание, но поместит нуль как результат, так что если вы бежите 10 обещаний, которые вы будете иметь результаты в виде массива из 10 элементов отвергнутого значение будет нулевым:

Promise.settle(arrayOfPromises).then(function(results){ 
    return results.map(function (result) { 
       return result.isFulfilled()? result.value() : null; 
      }); 
}).then(function(results){ 
    console.log("here you go:", results); 
}); 
Смежные вопросы