如何将承诺的XHR转换为异步/等待?

时间:2019-07-02 03:21:01

标签: javascript

function makeRequest(method, url) {
    return new Promise(function (resolve, reject) {
        let xhr = new XMLHttpRequest();
        xhr.open(method, url);
        xhr.onload = function () {
            if (this.status >= 200 && this.status < 300) {
                resolve(xhr.response);
            } else {
                reject({
                    status: this.status,
                    statusText: xhr.statusText
                });
            }
        };
        xhr.onerror = function () {
            reject({
                status: this.status,
                statusText: xhr.statusText
            });
        };
        xhr.send();
    });
}

我知道如何使用通过async / await返回诺言的函数,但是如何将其转换为async / await,根本没有诺言。 (我知道异步/等待是隐含的承诺)。

1 个答案:

答案 0 :(得分:2)

这是不可能的。 await(及其必须包含的async函数)在大多数情况下是Promise.prototype.then的替代品-它不是{em>不是的{ {1}}。换句话说,new Promiseawait一样,消耗一个承诺。如果没有可用的承诺,则不能使用.then(或者至少不明智)。

如果您有一些基于回调的内容,例如await,并且想与XMLHttpRequest.prototype.onload一起使用,则必须 both 首先将其转换为Promise(因为您'目前正在做),并且 await的承诺,例如:

await

(async () => { await makeRequest('GET', '/foo'); })(); 仍使用makeRequest显式创建Promise。