Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这总是会回来;“未定义”;_Javascript_Google Chrome Extension - Fatal编程技术网

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
});