2015-05-21 2 views
0

Я создаю виджет javascript, который будет загружать iframe на страницу, но для предотвращения загрузки iframe каждый раз, когда он запрашивается, поиск API сначала необходимо проверить, что devices, которые запрашиваются для загрузки внутри iframe, действительно существуют в базе данных.Promise.all() не получает данные, если обещание не разрешено.

Проблема у меня в том, что если элемент в products не существует в базе данных (что весьма вероятно, произойдет), то это обещание не будет решена, и в свою очередь, останавливает Promise.all(promises).then()... от возвращения data и я нужен этот массив data для передачи разрешенных устройств в iframe.

Любая помощь была бы принята с благодарностью!

function sendAPIRequest (product) { 

    return new Promise(function (resolve, reject) { 

     var url = 'http://localhost:3000/api/product_availability?__url_path_param='; 

     var xhr = createAPIRequest('GET', url + product); 

     if (!xhr) { 
      return; 
     } 

     xhr.onload = function() { 

      if (xhr.status == 200) { 

       resolve(product); 

      } else { 

       reject(Error(xhr.statusText)); 

      } 

     }; 

     xhr.onerror = function() { 

      reject(Error('Error fetching data...')); 

     }; 

     xhr.send(); 


    }); 

} 


function formatProductName (product) { 

    return product.replace(/ /g,"+").toLowerCase(); 

} 


function getProducts() { 

    var promises = []; 

    for (var i in products) { 

     promises.push(sendAPIRequest(formatProductName(products[i].product_name))); 

    } 

    Promise.all(promises).then(function (data) { 

     console.log(data); 

    }).catch(function (err) { 

     console.log(err); 

    }); 


} 

getProducts(); 

ответ

3

Promise.all().done вызывается, когда все обещания разрешены. Вы отказываетесь от некоторых обещаний.

Либо реализуйте fail, либо всегда решить, с успехом или значением ошибки. Это по существу перемещает вашу обработку ошибок по цепочке.

Вы также можете считать, что запрос на не существующий продукт завершается успешно и возвращает тело ошибки вместо данных продукта.

Смежные вопросы