Как использовать .then для функций asyn c - PullRequest
0 голосов
/ 10 апреля 2020

Итак, я пытаюсь связать запрос от API, и я знаю, что это асинхронный запрос. Однако я понимаю, что использование .then() возвращает обещание и что код ожидает его разрешения, прежде чем перейти к следующему .then(). Когда я console.log переменная encryptedAccountId вместо ее возврата, я получаю желаемый результат. Но когда я пытаюсь вставить это в следующий URL, он говорит, что переменная не определена. Я также пытался использовать await и async, но безуспешно. Что мне здесь не хватает?

let summonerName = 'nightblue3';
const region = ['na1', 'br1', 'eun1', 'euw1', 'jp1', 'kr', 'la1', 'la2', 'oc1', 'ru', 'tr1'];
let endIndex = 100;
let beginIndex = 0;
const fetch = require("node-fetch");

  let userUrl = `https://${region[0]}.api.riotgames.com/lol/summoner/v4/summoners/by-name/${summonerName}?api_key=${apiKey}`
  fetch(userUrl).then(res => {
        return res.json()})
        .then(getEncryptedAcccountId=> {
        var encryptedAccountId = (getEncryptedAcccountId.accountId)
        return encryptedAccountId})
        .then(fetch(`https://${region[0]}.api.riotgames.com/lol/match/v4/matchlists/by-account/${encryptedAccountId}?endIndex=${endIndex}&beginIndex=${beginIndex}&api_key=${apiKey}`))```

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Функция, которую вы передаете then(), действительно не будет вызываться до тех пор, пока не будет решено обещание then.

.then(fetch(`https://${region[...

Проблема в том, что вы не передает функцию then. Вы немедленно вызываете fetch() и передаете его возвращаемое значение (которое является обещанием, а не функцией).

Вместо этого передайте функцию:

.then((encryptedAccountId) => fetch(`https://${region[...

Вы также можете перейти к async / await синтаксису , который обычно более читабелен:

(async function () {
  let summonerName = "nightblue3";
  const region = ['na1', 'br1', 'eun1', 'euw1', 'jp1', 'kr', 'la1', 'la2', 'oc1', 'ru', 'tr1'];
  let endIndex = 100;
  let beginIndex = 0;
  const fetch = require("node-fetch");

  let userUrl = `https://${region[0]}.api.riotgames.com/lol/summoner/v4/summoners/by-name/${summonerName}?api_key=${apiKey}`;
  const userResponse = await fetch(userUrl);
  const userData = await userResponse.json();
  const encryptedAccountId = userData.accountId;
  const matchlists = await fetch(
    `https://${region[0]}.api.riotgames.com/lol/match/v4/matchlists/by-account/${encryptedAccountId}?endIndex=${endIndex}&beginIndex=${beginIndex}&api_key=${apiKey}`
  );
  // ...
})();
0 голосов
/ 10 апреля 2020

Вы могли бы написать это проще:

fetch(userUrl).then(res => res.json())
   .then(({ accountId }) => fetch(`your_url_with_${accountId}`))
...