Javascript jQuery在后台运行,但不在前台运行

Javascript jQuery在后台运行,但不在前台运行,javascript,jquery,asynchronous,Javascript,Jquery,Asynchronous,我有一段代码: if(!加密状态){ 如果(cKey==“”| cKey==null){ cKey=getKey(aid);//这里我们尝试获取密钥 如果(cKey!=“”&&cKey!=null&&cKey!=未定义){ if(isJSON(jKey)&&encryption_状态){ var tjKey=JSON.parse(jKey); tjKey[aid]=cKey; jKey=JSON.stringify(tjKey); }否则{ jKey=json.stringify({aid:c

我有一段代码:

if(!加密状态){
如果(cKey==“”| cKey==null){
cKey=getKey(aid);//这里我们尝试获取密钥
如果(cKey!=“”&&cKey!=null&&cKey!=未定义){
if(isJSON(jKey)&&encryption_状态){
var tjKey=JSON.parse(jKey);
tjKey[aid]=cKey;
jKey=JSON.stringify(tjKey);
}否则{
jKey=json.stringify({aid:cKey});
}
加密状态=真;
}
}
如果(!加密状态){
如果(cKey==“”| cKey==null){
cKey=rndstr(32);//生成字符串
}
var arr={};
if(isJSON(jKey))arr=JSON.parse(jKey);
arr[aid]=cKey;
jKey=JSON.stringify(arr);
加密状态=真;
}
}

一般来说,ajax调用是异步的。也就是说,像这样的序列

 var a = 0;

 a = getAwithAjaxFromServer(...);

 console.log(a);
将在ajax仍在运行时立即打印“0”

必须将
cley
encryption\u state
的整个逻辑置于
done
功能中:

if(!encryption_state){
    if(cKey=="" || cKey==null){
        cKey=getKey(aid);
    }
}
在您的ajax中:

function getKey(kaid){
    $.ajax({
        method: "POST",
        url: "/?mod=key&fnc=syncKey",
        data: {
            aid: kaid
        },
        done: function(data) {
            var tret = (JSON.parse(data)['msg']);


            .... PUT ALL THE LOGIC HERE .....

        }
    });
}

通常,ajax调用是异步的。也就是说,像这样的序列

 var a = 0;

 a = getAwithAjaxFromServer(...);

 console.log(a);
将在ajax仍在运行时立即打印“0”

必须将
cley
encryption\u state
的整个逻辑置于
done
功能中:

if(!encryption_state){
    if(cKey=="" || cKey==null){
        cKey=getKey(aid);
    }
}
在您的ajax中:

function getKey(kaid){
    $.ajax({
        method: "POST",
        url: "/?mod=key&fnc=syncKey",
        data: {
            aid: kaid
        },
        done: function(data) {
            var tret = (JSON.parse(data)['msg']);


            .... PUT ALL THE LOGIC HERE .....

        }
    });
}

您必须理解javascript中的异步机制才能继续调用ajax。有很多资源和问题。例如:

因此,您可以将代码转换为:

if(!encryption_state){
    var serverKeyCallback = function(cKey) {
        if(cKey!="" && cKey!=null && cKey!=undefined){
            if(isJSON(jKey) && encryption_state){
                var tjKey = JSON.parse(jKey);
                tjKey[aid] = cKey;
                jKey = JSON.stringify(tjKey);
            }else{
                jKey = json.stringify({aid: cKey});
            }
            encryption_state=true;
        }
    };
    var localKeyCallback = function(cKey) {
        if(!encryption_state){
            if(cKey=="" || cKey==null){
                cKey=rndstr(32); //generate string
            }
            var arr = {};
            if(isJSON(jKey)) arr = JSON.parse(jKey);
            arr[aid] = cKey;
            jKey = JSON.stringify(arr);
            encryption_state = true;
        }
    }
    manageKey(cKey, aid, serverKeyCallback, localKeyCallback);
}

function manageKey(cKey, kaid, serverKeyCallback, localKeyCallback) {
    if(cKey=="" || cKey==null) {
        $.ajax({
            method: "POST",
            url: "/?mod=key&fnc=syncKey",
            data: {
                aid: kaid
            },
            done: function(data) {
                var tret = (JSON.parse(data)['msg']);
                serverKeyCallback(tret);
                localKeyCallback(tret);
            }
        });     
    }
    else {
        localKeyCallback(cKey);
    }
}

定义两段封装的代码,一段在serverResponse之后执行,另一段在serverResponse之后或在本地存储cKey时执行。我还没有测试代码,但它必须像您预期的那样工作。

您必须了解javascript中的异步机制才能继续调用ajax。有很多资源和问题。例如:

因此,您可以将代码转换为:

if(!encryption_state){
    var serverKeyCallback = function(cKey) {
        if(cKey!="" && cKey!=null && cKey!=undefined){
            if(isJSON(jKey) && encryption_state){
                var tjKey = JSON.parse(jKey);
                tjKey[aid] = cKey;
                jKey = JSON.stringify(tjKey);
            }else{
                jKey = json.stringify({aid: cKey});
            }
            encryption_state=true;
        }
    };
    var localKeyCallback = function(cKey) {
        if(!encryption_state){
            if(cKey=="" || cKey==null){
                cKey=rndstr(32); //generate string
            }
            var arr = {};
            if(isJSON(jKey)) arr = JSON.parse(jKey);
            arr[aid] = cKey;
            jKey = JSON.stringify(arr);
            encryption_state = true;
        }
    }
    manageKey(cKey, aid, serverKeyCallback, localKeyCallback);
}

function manageKey(cKey, kaid, serverKeyCallback, localKeyCallback) {
    if(cKey=="" || cKey==null) {
        $.ajax({
            method: "POST",
            url: "/?mod=key&fnc=syncKey",
            data: {
                aid: kaid
            },
            done: function(data) {
                var tret = (JSON.parse(data)['msg']);
                serverKeyCallback(tret);
                localKeyCallback(tret);
            }
        });     
    }
    else {
        localKeyCallback(cKey);
    }
}

定义两段封装的代码,一段在serverResponse之后执行,另一段在serverResponse之后或在本地存储cKey时执行。我还没有测试代码,但是它必须按照您的预期工作。

尝试向ajax请求添加“上下文:此”也可以告诉我们您在网络选项卡中有哪些内容吗?ajax调用是异步的,因此您不能从
getKey
函数返回值尝试向ajax请求添加“上下文:此”也可以告诉我们您在网络选项卡中有哪些内容吗ajax调用是异步的,因此不能从
getKey
函数返回值