В целях повышения скорости построения массива для отправки на клиентскую сторону количество результатов разбивается на страницы на стороне клиента и, таким образом, сокращается на стороне сервера.
Вызов внешний 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;
});
});