Javascript 为什么这总是会回来;“未定义”;
以下代码始终返回“未定义” 我也尝试过这种变体,结果也一样Javascript 为什么这总是会回来;“未定义”;,javascript,google-chrome-extension,Javascript,Google Chrome Extension,以下代码始终返回“未定义” 我也尝试过这种变体,结果也一样 function sendCommand(cmdJson){ var msg; chrome.extension.sendRequest(cmdJson, function(response){ msg = response; }); return msg; } 如果我发出警报(响应)而不是返回响应我得到了期望值。我猜chrome.extension.sendRequest是异步的,在这
function sendCommand(cmdJson){
var msg;
chrome.extension.sendRequest(cmdJson, function(response){
msg = response;
});
return msg;
}
如果我发出
警报(响应)
而不是返回响应
我得到了期望值。我猜chrome.extension.sendRequest
是异步的,在这种情况下sendCommand
不会返回任何内容。sendCommand
中的响应处理程序返回某些内容,但与sendCommand
返回某些内容不同。因此,当您调用sendCommand
时,它将返回undefined
基本上,sendCommand
调用chrome.extension.sendRequest
函数,然后立即返回undefined
,而chrome.extension.sendRequest
函数仍在运行
没有真正的方法使异步行为同步-最好重新构造代码。我猜
chrome.extension.sendRequest
是异步的,在这种情况下sendCommand
不会返回任何内容。sendCommand
中的响应处理程序返回某些内容,但与sendCommand
返回某些内容不同。因此,当您调用sendCommand
时,它将返回undefined
基本上,sendCommand
调用chrome.extension.sendRequest
函数,然后立即返回undefined
,而chrome.extension.sendRequest
函数仍在运行
没有真正的方法使异步行为同步-最好重新构造代码。这很可能是因为您正在执行一个ajax调用,这本质上是异步的。异步函数无法返回值,因为无法知道异步调用何时完成 如果您使用的是jQuery,那么有两种选择可以解决这个问题。如果您使用的是jQuery1.5或更高版本,那么可以使用延迟对象。延迟对象是jQuery允许您用来与异步代码交互的新对象 默认情况下,jquery ajax函数(即$.ajax、$.get、$.post、$.getJSON)返回一个延迟对象,因此您所要做的就是将ajax调用存储在一个变量中,然后调用jquery延迟对象api中列出的可用方法。下面是我所看到的关于jQuery延迟对象的最好教程之一 其他选项是使jQueryAjax调用同步。您可以通过将asyncajax属性设置为false来实现这一点
$.ajax({
url: "someURL",
async: false
});
这很可能是因为您正在执行一个ajax调用,它本质上是异步的。异步函数无法返回值,因为无法知道异步调用何时完成 如果您使用的是jQuery,那么有两种选择可以解决这个问题。如果您使用的是jQuery1.5或更高版本,那么可以使用延迟对象。延迟对象是jQuery允许您用来与异步代码交互的新对象 默认情况下,jquery ajax函数(即$.ajax、$.get、$.post、$.getJSON)返回一个延迟对象,因此您所要做的就是将ajax调用存储在一个变量中,然后调用jquery延迟对象api中列出的可用方法。下面是我所看到的关于jQuery延迟对象的最好教程之一 其他选项是使jQueryAjax调用同步。您可以通过将asyncajax属性设置为false来实现这一点
$.ajax({
url: "someURL",
async: false
});
好吧,我原以为
chrome.extension.sendRequest(cmdJson,function(response){}
在等待响应时会被阻塞。@ZeroDivide好吧,我承认我不知道chrome扩展API,但从您描述的行为来看,我敢说sendRequest
是异步的。是的,这就是contentscripts(注入网页)与扩展的后台脚本对话(一个脚本在后台运行)。我想我只是假设它成功了,而不是将响应传递回调用函数。@ZeroDivide:sendRequest确实没有阻塞——它和Chrome API中的大多数其他类似API函数都是异步的。您必须依靠回调调用另一段代码,并通知它成功或失败@ZeroDivide假设它成功对我来说听起来很脆弱,但这是你的决定。你可以研究延迟/承诺/未来模式。或者干脆跳过你的sendCommand
函数,直接调用sendRequest
,当你得到一个我认为chrome.extension.sendRequest(cmdJson,function(response){}
会在等待响应时阻塞。@ZeroDivide好吧,我承认我不知道Chrome扩展API,但从您描述的行为来看,我敢说,sendRequest
是异步的。是的,这就是contentscripts(注入网页)如何与扩展的背景脚本对话(一个脚本在后台运行)。我想我只是假设它成功了,而不是将响应传递回调用函数。@ZeroDivide:sendRequest确实没有阻塞——它和Chrome API中的大多数其他类似API函数都是异步的。您必须依靠回调调用另一段代码,并通知它成功或失败@ZeroDivide假设它成功对我来说听起来很脆弱,但这是你的决定。你可以研究延迟/承诺/未来模式。或者干脆跳过你的sendCommand
函数,直接调用sendRequest
,在收到响应后继续
$.ajax({
url: "someURL",
async: false
});