Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 使用异步调用设置的JS变量的范围_Javascript_Jquery_Asynchronous - Fatal编程技术网

Javascript 使用异步调用设置的JS变量的范围

Javascript 使用异步调用设置的JS变量的范围,javascript,jquery,asynchronous,Javascript,Jquery,Asynchronous,我已经阅读并理解了JavaScript中异步调用的本质 使用jQuery3.2.1,我有一些代码可以对端点进行ajax调用,/get data,它返回一个带有属性和值的JSON结构,例如 { "download_list_groups_limit" : 2 } 如果JSON响应不包含属性download\u list\u groups\u limit,那么我将返回一个默认值,10(参见下面的代码) 这意味着我要么得到ajax响应的结果(本例中为2),要么得到默认值10 我想

我已经阅读并理解了JavaScript中异步调用的本质

使用jQuery3.2.1,我有一些代码可以对端点进行ajax调用,
/get data
,它返回一个带有属性和值的JSON结构,例如

{ "download_list_groups_limit" : 2 }
如果JSON响应不包含属性
download\u list\u groups\u limit
,那么我将返回一个默认值,
10
(参见下面的代码)

这意味着我要么得到ajax响应的结果(本例中为
2
),要么得到默认值10

我想将结果分配给一个名为
download\u list\u groups\u limit
的变量

我理解JavaScript的异步性质意味着对
/get data
的ajax调用必须在结果可用之前完成

我有以下代码:

var download_list_groups_limit = getSubstanceLimits(function(result) {
    console.log('result = ' + result);
});

console.log('download_list_groups_limit = ' + download_list_groups_limit);


function getSubstanceLimits(callback) {
    let filtered_response; 

    $.ajax({
        url : '/get-data',
        success: function(response) {
            if (response.download_list_groups_limit) {
                filtered_response = response.download_list_groups_limit; // 2 in this example
            } else {
                filtered_response = 10; // Default
            }
            callback(filtered_response);
        }
    });
}
console.log
语句返回以下内容:

download_list_groups_limit = undefined
result = 2
我的问题是关于范围:如果我想在脚本的全局范围内使用我的
结果
(例如,分配一个变量并将其设置为
2
),我该怎么做?似乎我唯一能做的就是在回调内部,即
getSubstanceLimits(函数(结果){…})内部


如果我需要在回调之外跨脚本中的各个点使用值2,那怎么可能呢?

更改脚本的入口点,以便在调用任何其他内容之前先调用
getSubstanceLimits
。在回调中,调用上一个入口点,该入口点运行脚本的其余部分。你可以这样做:

function getSubstanceLimits(callback) {
    $.ajax({
        url: '/get-data',
        success: function (response) {
            callback(response.download_list_groups_limit || 10);
        }
    });
}
而不是你先前的切入点,例如:

runApp();

你的整个应用程序不必在回调中,但无论你需要依赖于
结果的什么地方
都需要在回调中


您还可以使用jQuery-then-able来代替回调。

更改脚本的入口点,以便在调用任何其他内容之前,先调用
getSubstanceLimits
。在回调中,调用上一个入口点,该入口点运行脚本的其余部分。你可以这样做:

function getSubstanceLimits(callback) {
    $.ajax({
        url: '/get-data',
        success: function (response) {
            callback(response.download_list_groups_limit || 10);
        }
    });
}
而不是你先前的切入点,例如:

runApp();

你的整个应用程序不必在回调中,但无论你需要依赖于
结果的什么地方
都需要在回调中


您还可以使用jQuery-then-able来代替回调。

这不是范围问题。如果您只关心范围,那么将结果分配给全局变量是否有效

这里有一个例子证明它是有效的。我正在将单个
console.log()
替换为每秒记录一次:

var download_list_groups_limit;

getSubstanceLimits(function(result) {
    download_list_groups_limit = result;
    console.log('result = ' + result);
});

setInterval(function(){
    console.log('download_list_groups_limit = ' + download_list_groups_limit);
}, 1000);
您肯定会看到,在某个时间点,
download\u list\u groups\u limit
将更改为
result
的值

它不适用于您测试的代码的唯一原因是您记录
下载\u列表\u组\u限制
太早了。(当然,假设您将作业修改为我的示例)

如果您对依赖于
download\u list\u groups\u limit
的代码没有问题,直到它得到正确的值,那么您可以简单地执行我上面所做的操作。如果您对此不满意,则需要将其余代码放在
getSubstanceLimits
的回调中。你真的需要改变你对如何设计程序流的想法

有几种设计模式和语言特性可以使异步代码更易于管理,但您确实需要了解javascript中发生的事情是什么时候发生的。如果你熟悉C++语言和java语言,你对<强>范围<强>的理解应该已经正确。但您对事情发生时间的理解需要改进:

// THIS HAPPENS FIRST
var download_list_groups_limit;

// THIS HAPPENS SECOND
getSubstanceLimits(function(result) {
    // THINGS IN HERE HAPPENS LAST
    // AFTER END OF ALL CODE IN ALL FILES

    download_list_groups_limit = result;
    console.log('result = ' + result);
});

// THIS HAPPENS THIRD
console.log('download_list_groups_limit = ' + download_list_groups_limit);

// END OF CODE HAPPENS FOURTH

在你习惯于思考未来发生的事情之后,我建议你看看
Promise
s、
async/await
(使用promises)、事件侦听器和可观察对象等。这不是范围问题。如果您只关心范围,那么将结果分配给全局变量是否有效

这里有一个例子证明它是有效的。我正在将单个
console.log()
替换为每秒记录一次:

var download_list_groups_limit;

getSubstanceLimits(function(result) {
    download_list_groups_limit = result;
    console.log('result = ' + result);
});

setInterval(function(){
    console.log('download_list_groups_limit = ' + download_list_groups_limit);
}, 1000);
您肯定会看到,在某个时间点,
download\u list\u groups\u limit
将更改为
result
的值

它不适用于您测试的代码的唯一原因是您记录
下载\u列表\u组\u限制
太早了。(当然,假设您将作业修改为我的示例)

如果您对依赖于
download\u list\u groups\u limit
的代码没有问题,直到它得到正确的值,那么您可以简单地执行我上面所做的操作。如果您对此不满意,则需要将其余代码放在
getSubstanceLimits
的回调中。你真的需要改变你对如何设计程序流的想法

有几种设计模式和语言特性可以使异步代码更易于管理,但您确实需要了解javascript中发生的事情是什么时候发生的。如果你熟悉C++语言和java语言,你对<强>范围<强>的理解应该已经正确。但您对事情发生时间的理解需要改进:

// THIS HAPPENS FIRST
var download_list_groups_limit;

// THIS HAPPENS SECOND
getSubstanceLimits(function(result) {
    // THINGS IN HERE HAPPENS LAST
    // AFTER END OF ALL CODE IN ALL FILES

    download_list_groups_limit = result;
    console.log('result = ' + result);
});

// THIS HAPPENS THIRD
console.log('download_list_groups_limit = ' + download_list_groups_limit);

// END OF CODE HAPPENS FOURTH

在你习惯于思考未来发生的事情之后,我建议你看看
Promise
s、
async/await
(使用promises)、事件侦听器和类似于可观察的事物等。

你总是可以在外部范围中为某个变量或对象属性赋值。问题是知道何时可以访问该值。您可以。只需分配它
download\u list\u groups\u limit=result
。问题不在于它不起作用。问题是您是
console.loggi