同步XHR可以替代吗?

时间:2018-08-21 05:35:22

标签: javascript dom xmlhttprequest

我正在与第三方代码(Chrome扩展运行时,但与问题本身无关)进行交互。代码将阻塞,直到我的函数返回为止,这是我们所希望的行为。为了提供有意义的输出,我的函数需要知道XHR的结果。用代码术语来说,它的布局是这样的:

function() {
        let xhr = new XMLHttpRequest();
        xhr.open('GET', 'http://example.com', false);
        xhr.send(null);
        if (xhr.status == 200) {
            let jsonResponse = JSON.parse(xhr.responseText);
            return jsonResponse['neededData'];
        } else {
            console.error('API response invalid.');
        };
    };

对我来说,这是适合同步XHR的用例之一。不幸的是,synchronous XHR is being deprecated想要编写面向未来的代码,因此我正努力寻找其他选择。我进行了研究,但是在Internet或SO上找到的所有选项都无法满足我的限制:

还有其他选择吗?

1 个答案:

答案 0 :(得分:3)

  

我正在与第三方代码交互(Chrome扩展程序运行时,但与问题本身无关)

实际上,我认为Chrome的运行时与此处非常相关。为什么?好吧,Firefox已经解决了这个问题! Firefox扩展可以返回Promise,并且仍然可以修改请求标头。 MDN docs for webRequest.onBeforeSendHeaders

是的,这是Chrome令人困惑的行为。之前有人问过:BrowserExtension webRequest.onBeforeRequest return promise

就目前而言,我认为您被迫保持XHR同步。但是,如果您想花点时间,可以尝试使用异步Promise API,并在Chrome中运行时回退到同步。

我认为这是Chrome的错误,而不是您的代码。 Chrome的扩展程序API仍然很奇怪,就像使用chrome.runtime.lastError报告错误一样。 Firefox和Web Extension规范使用Promises。您可以在Chrome中使用Polyfill来访问某些基于Promise的API,但是很遗憾,无法填充此特定API。