javascript - 如果 promise 未解决,Promise.all() 不会接收数据

标签 javascript promise

我正在构建一个 javascript 小部件,该小部件会将 iframe 加载到页面上,但为了防止 iframe 在每次请求时加载,首先需要进行 API 查找来检查该 设备被请求加载的iframe里面实际上存在于数据库中。

我遇到的问题是,如果数据库中不存在products中的项目(这很可能发生),那么该 promise 将不会得到解决,进而停止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();

最佳答案

Promise.all().done 在所有 Promise 都得到解决后被调用。你拒绝了一些 promise 。

要么实现fail,要么always解决,并带有成功或错误值。这实质上将您的错误处理移至下游。

if (xhr.status == 200) {
    resolve({ status: "ok", product: product });
} else {
    resolve({ status: "fail" });
}

您还可以认为对不存在产品的请求成功并返回错误正文而不是产品数据。

关于javascript - 如果 promise 未解决,Promise.all() 不会接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30374188/

相关文章:

javascript - Angular JS 中的递归 promise

javascript - 为什么 Node 没有检测到我最近创建的文件

javascript - Bluebird 在非 Node 式回调上的 promise

node.js - 按顺序运行大量的 Promise

javascript - jQuery、bug 还是什么? selectmenu 小部件的 addClass 仅适用于第一个元素

引用不存在的 HTML 数据属性时的 JavaScript 行为?

javascript - 如何重置 svg 缩放并适合屏幕以获取具有不同方向的随机但大型 map /数据集

javascript - 表格标题 JavaScript

javascript - 在 promise 中 react setState 导致无限循环

javascript - 在 javascript 中跨越谷歌地图的平铺纹理