Javascript 承诺。尽管所有承诺都成功解决,但都失败了

Javascript 承诺。尽管所有承诺都成功解决,但都失败了,javascript,promise,Javascript,Promise,我正在编写一个简单的Javascript脚本,它使用XMLHttpRequest对象来查询API。脚本中有两个主要功能路由长度(startID,endID)和getSystemSecurity(systemID) 第一个方法返回一个Promise对象,在其中进行API调用: function routeLength (startID, endID) { return new Promise((resolve, reject) => { const url = `th

我正在编写一个简单的Javascript脚本,它使用XMLHttpRequest对象来查询API。脚本中有两个主要功能<代码>路由长度(startID,endID)
getSystemSecurity(systemID)

第一个方法返回一个Promise对象,在其中进行API调用:

function routeLength (startID, endID) {
    return new Promise((resolve, reject) => {
        const url = `the request URL`;
        const xml = new XMLHttpRequest();

        xml.onload = function () {
            var systems = this.response.split(',');
            const length = systems.length - 1;
            var routeSecurity = 2;
            var promises = [];
            systems.forEach((element) => {
                if (element[0] == '[') {
                    promises.push(
                        getSystemSecurity(element.substr(1, element.length - 1))
                    );
                }
                else if (element[element.length - 1] == ']') {
                    promises.push(
                        getSystemSecurity(element.substr(0, element.length - 1))
                    );
                }
                else promises.push(getSystemSecurity(element));
            });
            Promise.all(promises).then((values) => {
                values.forEach((v) => {
                    if (v < routeSecurity) routeSecurity = v;
                })
                resolve({"jumps":length,"security":routeSecurity});
            }).catch((error) => {
                reject(error)
            });
        };
    
        xml.open("GET", url);
        xml.send();
    })
}
从错误中可以看出,xml.statusText和xml.responseText没有填充,因此我无法确定正在发生的实际错误


那么,为什么Promise.all会失败,尽管所有请求都使用200个响应代码?

问题在于这一行:

xml.onerror = reject("Error executing XMLHttpRequest with ID " + systemID + xml.statusText + xml.responseText);
您不是在分配事件处理程序,而是在现场执行它

应该是:

xml.onerror = () => reject("Error executing XMLHttpRequest with ID " + systemID + xml.statusText + xml.responseText);

一般说明:请使用
fetch
API,它非常易于使用,而且它会立即返回一个承诺,这样您就可以摆脱所有那些
新承诺
构造。

问题在于这一行:

xml.onerror = reject("Error executing XMLHttpRequest with ID " + systemID + xml.statusText + xml.responseText);
您不是在分配事件处理程序,而是在现场执行它

应该是:

xml.onerror = () => reject("Error executing XMLHttpRequest with ID " + systemID + xml.statusText + xml.responseText);

一般说明:请使用
fetch
API,它使用起来非常简单,而且它会立即返回一个承诺,这样您就可以摆脱所有那些
新承诺
构造。

使用更现代的
fetch()实现这一点要容易得多
而不是
XMLHttpRequest
,因为它更健壮,并且是基于承诺的,所以使用更现代的
fetch()
而不是
XMLHttpRequest
更容易做到这一点,因为它更健壮,并且是基于承诺的