Как вернуть данные Promise.all для получения данных api json? - PullRequest
0 голосов
/ 27 февраля 2019

Как мне использовать данные Promise.all для получения api json?Это нормально работает, если я не использую Promise.all.С .all он на самом деле возвращает значения запроса в консоли, но по какой-то причине я не могу получить к нему доступ.Вот мой код и как он выглядит в консоли после разрешения.

Promise.all([
    fetch('data.cfc?method=qry1', {
        method: 'post',
        credentials: "same-origin", 
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        body: $.param(myparams0)
    }),
    fetch('data.cfc?method=qry2', {
        method: 'post',
        credentials: "same-origin", 
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        body: $.param(myparams0)
    })
]).then(([aa, bb]) => {
    $body.removeClass('loading');
    console.log(aa);
    return [aa.json(),bb.json()]
})
.then(function(responseText){
    console.log(responseText[0]);

}).catch((err) => {
    console.log(err);
});

Все, что я хочу, - это иметь доступ к data.qry1.Я пытался с responseText [0] .data.qry1 или responseText [0] ['data'] ['qry1'], но он возвратил неопределенное.Ниже приведен вывод из console.log responseText [0].Console.log (aa) выдает Response {тип: "basic" ...

    Promise {<resolved>: {…}}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: Object
data: {qry1: Array(35)}
errors: []

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Вместо return [aa.json(),bb.json()] используйте return Promise.resolve([aa.json(),bb.json()]).См. Документацию по Promise.resolve () .

0 голосов
/ 17 апреля 2019

Самое простое решение - повторить использование Promise.all, чтобы дождаться разрешения всех .json ().Просто используйте

Promise.all([fetch1, ... fetchX])
.then(result => Promise.all(result.map(v => v.json()))
.then(result => {... result[0, ...X] available as objects})
0 голосов
/ 27 февраля 2019

Очевидно, aa.json() и bb.json() возвращаются до разрешения, добавление async/await к этому решит проблему:

.then(async([aa, bb]) => {
    const a = await aa.json();
    const b = await bb.json();
    return [a, b]
  })

Promise.all([
    fetch('https://jsonplaceholder.typicode.com/todos/1'),
    fetch('https://jsonplaceholder.typicode.com/todos/2')
  ]).then(async([aa, bb]) => {
    const a = await aa.json();
    const b = await bb.json();
    return [a, b]
  })
  .then((responseText) => {
    console.log(responseText);

  }).catch((err) => {
    console.log(err);
  });

Тем не менее, все еще ищем лучшее объяснение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...