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

问题描述:

下面的代码总是返回“未定义”为什么这个总是返回“未定义”

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;我得到预期的价值。

我猜chrome.extension.sendRequest是异步的,在这种情况下sendCommand不会返回任何东西。sendCommand中的响应处理程序是返回某个内容的那个,但这不相同,因为sendCommand返回了一些内容。所以当你拨打sendCommand时,它会返回undefined

基本上,sendCommand调用chrome.extension.sendRequest功能,然后返回undefined向右走,而chrome.extension.sendRequest功能仍在运行。

没有真正的方法让异步行为同步 - 最好重构你的代码。

+0

好,我想'chrome.extension.sendRequest(cmdJson,函数(响应),而它等待响应{}'会阻止。 – ZeroDivide 2012-02-13 01:20:43

+0

@ZeroDivide好吧,我承认我不知道Chrome扩展API,但根据你描述的行为来判断,我认为“sendRequest”是异步的是一个公平的选择 – Flambino 2012-02-13 01:22:55

+0

是的,它的内容如何(注入到网页中)与扩展的后台脚本(一个脚本在后台运行)。我想我会假设它会成功,而不是将响应传递回调用函数。 – ZeroDivide 2012-02-13 01:24:19

这很可能是因为您正在执行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调用同步。您可以通过将async ajax属性设置为false来完成此操作。

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