首页 > 解决方案 > node.js:昂贵的请求

问题描述

大家好!我的第一个应用程序需要一些帮助:

我正在创建一个以 express+node.js 为背景的应用程序。没有数据库。我正在使用具有某些功能的 3rd-party 解决方案,而不是进行计算。

正面

50 个对象。每个对象都有一个唯一值:随机数。一开始我有所有这些对象,我需要为每个对象计算一些值并根据计算结果将其放置在表单上。

每个对象发送:axios.get('/calculations?value=uniqueValue')我将结果累积在一个数组中。何时array.length等于 50 我将相互比较数组元素并定义每个对象的 (x, y) 坐标。之后,对象将出现在表单上。

后退

let value = uniqueValue; // an unique value received from an object
let requests = [];
for (let i = 0; i < 1500; i++) { // this loop is necessary due to application idea
      requests.push(calculateData(value)); // 3rd-party function
      value += 1250;
    }
let result = await Promise.all(requests);
let newData = transform(result); // here I transform the calculated result and then return it.
return newData

一个对象的计算需要 700 毫秒。所有 50 个对象的所有计算花费 ≈10 秒。3rd-party 函数同时只接收一个值,但运行速度非常快。但是循环for (let i = 1; i < 1500; i++) {…}非常昂贵。

问题

  1. 10秒不是一个好结果,用户不能等那么久。可能我应该改变计算方法吗?
  2. 服务器在计算时非常忙,并且其他请求(例如axios.get('/getSomething?params=something')待处理)。

任何建议将不胜感激!

标签: javascriptnode.jsoptimization

解决方案


You can make the call in chunks of data using async.eachLimit


var values = [];
for (let i = 0; i < 1500; i++) { // this loop is necessary due to application idea
      values.push(value);
      value += 1250;
    }
     var arrayOfItemArrays = _.chunk(values, 50);

      async.eachLimit(arrayOfItemArrays, 5, eachUpdate, function(err, result){let 
      newData = transform(result); 
      return newData ;
});

function eachUpdate(req_arr, cb){
  var result = []
  req_arr.forEach(fucntion(item){
     calculateData(item).then((x){
     result.push(x);
  });
 cb(result);
}

推荐阅读