Jquery ';sendResponse';从background.js函数到外部页面的数据

Jquery ';sendResponse';从background.js函数到外部页面的数据,jquery,google-chrome-extension,Jquery,Google Chrome Extension,我有一个外部页面,它向我的Chrome扩展发送消息,后台脚本获取消息并响应它。但是,我想首先处理函数getID(),然后才将响应(带有ID)发送回外部页面。 我已经尝试:设置一个$.when()和一个setTimeout来等待getID。但是什么都不起作用,而且响应总是“未定义” 是否要等待函数执行,然后才将ID发送回外部页面 外部页面(发送消息) 背景脚本 var id; function getID(){ $.get("url1", function( data1 ) {

我有一个外部页面,它向我的Chrome扩展发送消息,后台脚本获取消息并响应它。但是,我想首先处理函数getID(),然后才将响应(带有ID)发送回外部页面。 我已经尝试:设置一个
$.when()
和一个
setTimeout
来等待getID。但是什么都不起作用,而且响应总是“未定义”

是否要等待函数执行,然后才将ID发送回外部页面

外部页面(发送消息)

背景脚本

var id;

function getID(){
    $.get("url1", function( data1 ) {
        //process data1 and use part of data1 on next get       
        $.get("url2", function( data2 ) {
            //process data2 and use part of data2 on next get
            $.get("url3", function( data3 ) {
                //process data3 and return
                return id;
            });
        });
    });
}

chrome.runtime.onMessageExternal.addListener(
    function(request, sender, sendResponse) {
        getID();
        sendResponse({user: id});       
});
你。请先阅读该问题,然后再继续

您需要在最后一次回调中调用
sendResponse(id)
。此外,您还可以通过从处理程序返回
true

function getID(callback){
    $.get("url1", function( data1 ) {
        //process data1 and use part of data1 on next get       
        $.get("url2", function( data2 ) {
            //process data2 and use part of data2 on next get
            $.get("url3", function( data3 ) {
                //process data3 and pass the result to callback
                callback(id);
            });
        });
    });
}

chrome.runtime.onMessageExternal.addListener(function(request, sender, sendResponse) {
    getID(function(id) {
        // Will be called asynchronously from getID()
        sendResponse({user: id});
    });
    return true; // Tell Chrome we need sendResponse asynchronously
});
你。请先阅读该问题,然后再继续

您需要在最后一次回调中调用
sendResponse(id)
。此外,您还可以通过从处理程序返回
true

function getID(callback){
    $.get("url1", function( data1 ) {
        //process data1 and use part of data1 on next get       
        $.get("url2", function( data2 ) {
            //process data2 and use part of data2 on next get
            $.get("url3", function( data3 ) {
                //process data3 and pass the result to callback
                callback(id);
            });
        });
    });
}

chrome.runtime.onMessageExternal.addListener(function(request, sender, sendResponse) {
    getID(function(id) {
        // Will be called asynchronously from getID()
        sendResponse({user: id});
    });
    return true; // Tell Chrome we need sendResponse asynchronously
});

id
仍将是
未定义的
id
不会存储在任何全局变量中,它只传递给回调函数。您可以将其分配给某个对象,但因为所有内容都是异步的,所以在使用它时需要小心。如果您还不太了解这一点,我建议您使用。
id
仍然是
未定义的
id
不会存储在任何全局变量中,它只传递给回调。您可以将其分配给某个对象,但因为所有内容都是异步的,所以在使用它时需要小心。我建议你,如果你还不太明白的话。