为什么这总是返回“未定义”

时间:2012-02-13 01:10:39

标签: javascript google-chrome-extension

以下代码始终返回“undefined”

function sendCommand(cmdJson){
    chrome.extension.sendRequest(cmdJson, function(response){
        return response;
    });
}

我也尝试过这个变种,结果相同

function sendCommand(cmdJson){
    var msg;
    chrome.extension.sendRequest(cmdJson, function(response){
        msg = response;
    });
    return msg;
}

如果我执行alert(response);而不是return response;,我会得到预期值。

2 个答案:

答案 0 :(得分:4)

我猜测chrome.extension.sendRequest是异步的,在这种情况下sendCommand不会返回任何内容。 sendCommand内部的响应处理程序是返回内容的那个,但这与返回某些内容的sendCommand不一样。因此,当您致电sendCommand时,它会返回undefined

基本上,sendCommand调用chrome.extension.sendRequest函数,然后立即返回undefined,而chrome.extension.sendRequest函数仍在运行。

没有真正的方法可以使异步行为同步 - 重新构建代码会更好。

答案 1 :(得分:0)

这很可能是因为您正在执行ajax调用,这本质上是异步的。异步函数无法返回值,因为无法知道异步调用何时完成。

如果您使用的是jQuery,则可以使用两种方法来解决此问题。如果您使用的是jQuery 1.5或更高版本,则可以使用延迟对象。延迟对象是jQuery允许您用来与异步代码交互的新对象。

默认情况下,jquery ajax函数(即$ .ajax,$。get,$。post,$。getJSON)返回一个Deferred Object,所以你要做的就是将ajax调用存储在一个变量中,然后调用jQuery Deferred Object api中列出的可用方法。这是我在jQuery Deferred Objects上看到的最好的教程之一。 http://www.erichynds.com/jquery/using-deferreds-in-jquery/

var sendResponse = $.get("/getResponse");

//Somewhere else in your code
sendResponse.success(function(response) {
    return response;
});

其他选项是让你的jquery ajax调用同步。您可以通过将异步 ajax属性设置为 false 来执行此操作。

$.ajax({
    url: "someURL",
    async: false
});