繁体   English   中英

为什么这总是返回“ undefined”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM