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

标签 javascript json asynchronous

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

{
    logins: 5000,
    clicks: 1000
}

假设我需要对每个服务器响应的所有登录进行求和。

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

var result = 0;

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

一个解释为什么需要锁的例子:

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

假设第二个回调尚未完成,无论出于何种原因,第三个回调被称为我的 promise 。

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

那么大家觉得怎么样?结果是否自动锁定?如果没有,在js中创建锁定模式是否容易?

感谢您的回答!

最佳答案

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

如果您发送许多 ajax 调用请求,响应可能不会按顺序出现,因此如果您需要顺序,可以强制 ajax 调用同步运行 ( if you use $http from Angular you can't )。

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

如果您愿意,可以执行一些操作,例如在上一个成功回调上调用下一个端点:

$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))

根据您想要实现的目标,我将使用 key 来跟踪回调中的请求,甚至在需要时使用服务器。

如果您只需要所有“登录”计数器的总和并且不需要订单

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)
    })
});

关于javascript - 异步获取数据,将结果聚合到一个对象。默认情况下,对象是否被 javascript 锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39119725/

相关文章:

java - couchbase 中每个 java POJO 的文档模型是什么

javascript - 带有回调函数的异步 API 请求

java - CompletableFuture.thenAccept 中使用的垃圾回收对象的可用性

javascript - 揭示模块模式有 undefined variable

javascript - 我的 javascript 循环/while 语句代码不起作用,请帮助我确定我的问题

javascript - 如何在删除之前检查元素中是否包含 HTML?查询

javascript - 使四个 div 的网格展开以匹配最高的高度

json - 无法读取 null Angular2 JSON 的属性 'name'

javascript - Angular Filter,将 JSON 文件日期与今天的日期进行比较

javascript - Nodejs函数依赖