Повторять обещание, пока массив не достигнет определенной длины? - PullRequest
0 голосов
/ 28 мая 2020

В целях повышения скорости построения массива для отправки на клиентскую сторону количество результатов разбивается на страницы на стороне клиента и, таким образом, сокращается на стороне сервера.

Вызов внешний API, мы решили ограничить количество результатов, возвращаемых API, чтобы найти минимальное количество результатов API, которые будут соответствовать максимальному количеству результатов, которые будут отображаться на клиенте -side (не каждый результат, возвращаемый API, является релевантным).

Для этого мы думаем, что нам нужно повторять наше обещание, , пока массив не достигнет желаемой длины (т.е. 20 объектов в массиве ) - есть ли правильный способ сделать это?

(И в целом, будет ли этот подход считаться хорошим методом оптимизации производительности для таких результатов? Также не уверен, что структура обещания ниже даже правильный способ последовательно l oop просмотреть и изменить эти данные ...)

var Promise = require('bluebird');

// iterate sequentially, and return a modified array
function mapSeries(things, fn) {
  var results = [];
  return Promise.each(things, function(value, index, length) {
    var ret = fn(value, index, length);
    results.push(ret);
    return ret;
  }).thenReturn(results).all();
}


AcquireCredentials(Tokens).then(Credentials => {

  var ArrayForClient = []; // ARRAY TO BE SENT TO THE CLIENT SIDE

  const ExternalAPI = APIprovider({auth: Credentials});

  // INSERT SOME SORT OF PROMISIFIED WHILE LOOP HERE?

  return ExternalAPI.top_level_call({
    "parameter": "value",
    "numberofresults": 10
  }).then(function(first_results) {

        // loop through each result of the first_results.data array
        return mapSeries(first_results.data, function(result_of_first_call){

          return ExternalAPI.detail_level_call({
            "parameter": result_of_first_call.value
          }).then(function(second_results) {

                // loop through each result of the second_results.data array
                return mapSeries(second_results.data, function(result_of_second_call) {

                    // loop through each element in the result_of_second_call.array
                    return mapSeries(result_of_second_call.array, function(result_of_second_call_array_element) {

                        if (result_of_second_call_array_element.parameter == 'ElementA') {

                          // construct a new array containing data from the result_of_second_call_array_element
                          const ConstructedArrayA = ConstructArrayFunction(result_of_second_call_array_element);

                          // loop through the new ConstructedArrayA
                          return mapSeries(ConstructedArrayA, function(ConstructedArrayA_Element) {

                            // DO STUFF WITH EACH ConstructedArrayA_Element TO POPULATE ArrayForClient

                          });

                        } else if (result_of_second_call_array_element.parameter == 'ElementB') {

                          // construct a new array containing data from the result_of_second_call_array_element
                          const ConstructedArrayB = ConstructArrayFunction(result_of_second_call_array_element);

                          // loop through the new ConstructedArrayB
                          return mapSeries(ConstructedArrayB, function(ConstructedArrayB_Element) {

                            // DO STUFF WITH EACH ConstructedArrayB_Element TO POPULATE ArrayForClient

                          });

                        }

                  });

              });

        });

      });

    }).then(function(result) {

      // loop through each object in the ArrayForClient
      return mapSeries(ArrayForClient, function(ArrayForClient_Object) {

        // DO STUFF WITH EACH ArrayForClient_Object TO POPULATE ADDITIONAL DATA IN ArrayForClient

      });

    }).then(function(result) {

      log.info("Promise Complete!"); // This will run after the last step is done

      // An example of what ArrayForClient looks like
      // ArrayForClient = [
      //    {
      //      parameterX : "valueX",
      //      parameterY : "valueY",
      //      parameterZ : "valueZ"
      //    },
      //    {
      //      parameterX : "valueX",
      //      parameterY : "valueY",
      //      parameterZ : "valueZ"
      //    }
      // ];

      // Respond with the JSON of ArrayForClient
      res.json({
        ArrayForClient : ArrayForClient
      });

    }).catch(function(err){

      log.error(err);
      res.send(err);
      throw err;

    });

});
...