javascript - Chrome 扩展 : Why is my response returning before the AJAX call?

标签 javascript google-chrome-extension

我正在从我的 popup.html 进行 AJAX 调用,如下所示..

chrome.extension.sendRequest(
                    {
                        req: "send",
                        url: requrl
                    },
                    function(response)
                    {
                        console.log("RESPONSE:" + response.reply);
                    });

这段代码适用于background.html中的以下情况...

                case "send":
                sendResponse({
                    reply: send(request.url)
                });
                break;

这又调用以下...

    function send(uri)
{
    var xhr = new XMLHttpRequest();
    xhr.open("POST",uri,true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
    xhr.onreadystatechange = function (send){
        if(xhr.readyState == 4){
            return xhr.responseText;
        }
    }
    xhr.send(null);
}

我的问题是,在 send() 有机会响应之前,我的代码返回了 undefined。如何让我的代码等待响应?我需要保持此调用异步,因为我需要不卡住 UI 来显示进度对话框。

最佳答案

您收到 undefined 的原因是这是 send 函数的结果。如果您按原样查看该函数,您会发现它在 send(null) 之后退出。 return 语句要在一段时间后才会执行,到那时就没有任何东西可以接收它了。

如果您想在 XHR 请求完成时进行响应,则需要使用回调。

简而言之:

case "send:"
  send(request.url, function(response) {
    sendResponse(response);
  })

function send(uri, callback) {
  ...
  xhr.onreadystatechange = function (send){
    if(xhr.readyState == 4){
      callback(xhr.responseText);
    }
  }
  ...
}

参见other asynchronous callback questions .

关于javascript - Chrome 扩展 : Why is my response returning before the AJAX call?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6015895/

相关文章:

javascript - Handlebars 动态访问变量

javascript - js querySelectorAll 不是有效的选择器,尽管它类似于文档示例

google-chrome-extension - chrome.tabs.executeScript 不工作?

javascript - Google Chrome Extension - content_scripts 与 background_page js 文件通信

javascript - Chrome 扩展 API sendMessage(更新后 : 49. 0.2623.87)

javascript - 这里需要延迟执行 jQuery 吗?

javascript - 格式化 JSON 时遇到问题

javascript - 如何动态创建多个Jquery颜色选择器(eyecon)?

javascript - Angularjs 自定义验证指令

javascript - 错误没有 Jest : This usually means that you are trying to import a file which Jest cannot parse, 例如它不是普通的 JavaScript