[英]Why does this always return “undefined”
以下代码始终返回“ 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;
我得到了期望值。
我猜chrome.extension.sendRequest
是异步的,在这种情况下sendCommand
不返回任何内容。 sendCommand
内的response-handler是一个返回内容的函数,但这与sendCommand
返回某些内容不同。 因此,当您调用sendCommand
它将返回undefined
。
基本上, sendCommand
调用chrome.extension.sendRequest
函数,然后在chrome.extension.sendRequest
函数仍在运行时立即返回undefined
。
没有真正的方法可以使异步行为同步执行-最好重组代码。
这很可能是因为您正在执行ajax调用,该调用本质上是异步的。 异步函数无法返回值,因为无法知道异步调用何时完成。
如果使用的是jQuery,则有两个替代方法可以解决此问题。 如果您使用的是jQuery 1.5或更高版本,则可以使用Deferred Objects。 延迟对象是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
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.