为什么这个总是返回“未定义”
下面的代码总是返回“未定义”为什么这个总是返回“未定义”
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
功能仍在运行。
没有真正的方法让异步行为同步 - 最好重构你的代码。
这很可能是因为您正在执行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
});
好,我想'chrome.extension.sendRequest(cmdJson,函数(响应),而它等待响应{}'会阻止。 – ZeroDivide 2012-02-13 01:20:43
@ZeroDivide好吧,我承认我不知道Chrome扩展API,但根据你描述的行为来判断,我认为“sendRequest”是异步的是一个公平的选择 – Flambino 2012-02-13 01:22:55
是的,它的内容如何(注入到网页中)与扩展的后台脚本(一个脚本在后台运行)。我想我会假设它会成功,而不是将响应传递回调用函数。 – ZeroDivide 2012-02-13 01:24:19