繁体   English   中英

异步获取数据,将结果聚合到一个对象中。 默认情况下,对象是否被javascript锁定?

[英]Async fetch data, aggregate the result to an object. Is the object locked by javascript by default?

假设我要从1000台服务器中获取一些数据。 每个服务器返回相同的json结构。 虚拟示例:

{
    logins: 5000,
    clicks: 1000
}

假设我需要汇总每个服务器响应中的所有登录信息。

我想在每个回调(= 1000次)中执行此操作,而不是查询所有json然后执行总和。 基本示例:

var result = 0;

$http.get(url).then(function(response) {
    result += response.data.logins;
});

解释为什么需要锁定的示例:

如果我的第一台服务器返回1000,则第二台服务器返回2000,第三台服务器返回3000;

假设由于某种原因,当第三个回调称为我的诺言时,第二个还未完成。

如果没有锁定结果,则在第三个回调结束时可能等于4000,这是错误的(正确值为6000);

那你们觉得呢? 结果是否自动锁定? 如果不是,是否很容易在js中创建锁定模式?

感谢您的回答!

我更新了答案,因为问题已编辑:

如果发送许多ajax调用请求,则响应可能无法按顺序进行,因此,如果需要该命令,则可以强制ajax调用同步运行( 如果使用Angular中的$ http则不能 )。

但是我永远不会那样做(我总是会使用异步),尤其是因为您要发送的请求数量...

如果您愿意,可以执行类似的操作,只需在上一个成功回调中调用下一个端点:

$http.get(url).then(function(response) {
    result += response.data.logins;
    $http.get(url).then(function(response) {
        result += response.data.logins;
        /// ... (use a loop)
    });
});

例:

 const data = [ { isActive: "1", logins: 1000, clicks: 1000 }, { isActive: "1", logins: 2000, clicks: 1000 }, { isActive: "1", logins: 3000, clicks: 1000 }]; const callApi = (index, timeout) => { return new Promise((resolve, reject) => { setTimeout(() => resolve({data: data[index]}), timeout); }) }; let result = 0; let timeouts = [0, 3000, 0]; const callback = (resp, index) => { result += resp.data.logins; console.log(`Result now in callback ${index + 1}:`, result); if (index < timeouts.length - 1) { index++; callApi(index, timeouts[index]).then(resp => callback(resp, index)) } } callApi(0, timeouts[0]).then(resp => callback(resp, 0)) 

根据您要实现的目标,我将使用键在回调中跟踪请求,即使您需要也可以使用服务器。

如果您只需要所有“登录”计数器的总和,而无需订购

 const data = [ { isActive: "1", logins: 1000, clicks: 1000 }, { isActive: "1", logins: 2000, clicks: 1000 }, { isActive: "1", logins: 3000, clicks: 1000 }]; const callApi = (index, timeout) => { return new Promise((resolve, reject) => { setTimeout(() => resolve({data: data[index]}), timeout); }) }; let result = 0; [0, 3000, 0].forEach((timeout, index) => { callApi(index, timeout) .then(res => { result += res.data.logins console.log(`Result now in callback ${index + 1}:`, result) }) }); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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