Получите данные с первого. Затем на основе условия на втором. Затем - PullRequest
2 голосов
/ 19 июня 2020

Я использовал обещания, как рекомендовалось в моем предыдущем вопросе, чтобы получить значения из 2 вызовов asyn c.

Но я хочу, чтобы результаты моего первого вызова основывались на условии моего второго вызова. Я продолжаю терять определение, когда делаю то, что делаю. Как мне получить желаемый результат.

Первый JSON:

let first_json = [
    {
        "company": "one"
    },
    {
        "company": "two"
    },
    {
        "company": "three"
    }
]

Второй JSON зависит от первого и имеет аналогичный формат.

Используя обещания, которые я сделал:

$.getJSON(first_json)
 .then(first_data =>
      first_data.map(d => {
          return d.company;
      })
  )
 .then(promises => Promise.all(promises))
 .then(company => company.map(c => {
        let second_json = json_string + c;
        $.getJSON(second_json, function(data) {
            if (data.length > 0) return c;
        });
    }))
 .then(arr => {
     console.log(arr);
  });

arr для меня должен возвращать ['one', 'three'], но вместо этого возвращается: [undefined, undefined, undefined].

Почему это происходит и как мне исправить?

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Ваш обратный вызов является асинхронным, поэтому, если вы не «ожидаете» его с помощью then, он не будет доступен вам сразу, и, следовательно, вы не сможете действовать на его основе.

Вместо этого сделайте это так:

$.getJSON(first_json)
  .then(first_data =>
    first_data.map(d => {
      return d.company;
    })
  )
  .then(promises => Promise.all(promises))
  .then(company => company.map(c => {
    let second_json = json_string + c;
    return $.getJSON(second_json)
      .then(data => {
        if (data.length > 0) return c;
      });
  }))
  .then(promises => Promise.all(promises))
  .then(arr => {
    console.log(arr);
  });
1 голос
/ 19 июня 2020

Вы применяете Promise.all не на той стадии:

$.getJSON(first_json).then(first_data => {
    const companies = first_data.map(d => {
        return d.company;
    });
    const promises = companies.map(c => {
//        ^^^^^^^^
        let second_json = json_string + c;
        return $.getJSON(second_json).then(data => {
//      ^^^^^^
            if (data.length > 0) return c;
        });
    });
    return Promise.all(promises);
//         ^^^^^^^^^^^
}).then(arr => {
    console.log(arr);
});
...