Консолидированный объект результата из последовательности вызовов getJSON () - PullRequest
0 голосов
/ 18 мая 2018

Я использую jquery после долгого времени.У меня есть требование, в котором мне нужно вызвать несколько API-интерфейсов Rest для получения некоторых данных из каждого API.Затем из результатов всех вызовов создайте объединенный результирующий объект.

Примерно так:

Вывод, который я ищу:

result {
    a: 123,
    b: 456, ....
    z: 789
}

Псевдо:

var result = {}; // final object containing consolidated result
$.getJSON(restapi1, function (data) {
    result["a"] = data.total;
});

// next rest call to fetch b
$.getJSON(restapi2, function (data) {
    result["b"] = data.total;
});

// so on...
// after fetching all values and storing them in one result object access elements like
var value1 = result.a;

Я знаю, что могу использовать Promise.all(), но он дает массив в качестве вывода, и я хочу избежать циклического перебора по нему для извлечения требуемого элемента.

Пожалуйста, предложите. Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Я бы подошел к этому примерно так:

// a wrapper for the basic retrieval functionality
async function getTotal( param ) {
  const res = await $.getJSON( param.url );
  return { name: param.name, total: res.total };
}

async function getData() {
  // start all requests
  // api list contains entries like { name: 'a', url: restapi1 }
  const reqs = apilist.map( url => getTotal )

  // wait for all requests to finish
  const resp = await Promise.all( reqs );

  // convert to the output format
  return resp.reduce( (el,all) => { all[el.name] = el.total; return all; }, {} );
}

getData().then( (result) => /* ... */ );
0 голосов
/ 18 мая 2018

Я знаю, что могу использовать Promise.all(), но он выдает массив в качестве вывода

True, но вам не нужно использовать результат, который он предоставляет.Вы можете использовать побочные эффекты так же, как и в своем псевдокоде.

Если все ваши различные вызовы $.getJSON написаны по отдельности, это пример использования для jQuery $.when:

var result = {}; // final object containing consolidated result
$.when(
    $.getJSON(restapi1, function (data) {
        result["a"] = data.total;
    }),
    // next rest call to fetch b
    $.getJSON(restapi2, function (data) {
        result["b"] = data.total;
    }),
    // ...
).done(function() {
    // use `result`
});

Если вместо этого у вас есть цикл, использование $.when возможно, но неудобно:

var result = {}; // final object containing consolidated result
var promises = [];
for (/*...*/) {
    promise.push($.getJSON(/*...*/));
}
$.when.apply($, promises).done(function() {
    // use `result`
});

... поэтому в этой ситуации Promise.all, вероятно, лучше, если вы предполагаете, что он присутствует в среде (изначально)или потому что вы заполняете его или используете расширенную библиотеку обещаний):

var result = {}; // final object containing consolidated result
var promises = [];
for (/*...*/) {
    promise.push($.getJSON(/*...*/));
}
Promise.all(promises).done(function() {
    // use `result`
});
...