node.js:昂贵的请求

时间:2019-03-12 10:21:06

标签: javascript node.js optimization

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

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

前面

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秒。第三方功能只能同时接收一个值,但是工作非常迅速。但是循环for (let i = 1; i < 1500; i++) {…}非常昂贵。

问题

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

任何建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

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