以下代码始终返回“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;
,我会得到预期值。
答案 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
});