Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome扩展:为什么我的响应在AJAX调用之前返回?_Javascript_Google Chrome Extension - Fatal编程技术网

Javascript Chrome扩展:为什么我的响应在AJAX调用之前返回?

Javascript Chrome扩展:为什么我的响应在AJAX调用之前返回?,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我正在从我的popup.html中调用AJAX,就像这样 chrome.extension.sendRequest( { req: "send", url: requrl }, function(response) {

我正在从我的
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不冻结以显示进度对话框。

返回未定义的
的原因是这是
发送功能的结果。如果您查看当前函数,它将在
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);
    }
  }
  ...
}
c、 f