Как мне принять это второе обещание? - PullRequest
0 голосов
/ 24 марта 2020

Вот код

console.log("Before");
const p = getUser(1);
p.then(user => {
  console.log(user);
  getRepositories(user.github);
}).then(repos => {
  console.log(repos);
});

console.log("after");

function getUser(id) {
  return new Promise(function(resolve, reject) {
    setTimeout(() => {
      console.log("Calling a database " + id);
      resolve({ id: id, github: "Zain" });
    }, 2000);
  });
}

function getRepositories(username) {
  return new Promise(function(resolve, reject) {
    setTimeout(() => {
      console.log(`Calling Api for ${username}`);
      resolve(["repo1", "repo2", "repo3"]);
    }, 2000);
  });
}

У меня проблемы с использованием обещания, возвращаемого функцией getRepositories(). Выше моя реализация, но она не работает и возвращает undefined (вместо массива [repo1, repo2, repo3]).

Вот вывод:
enter image description here

Я хочу, чтобы массив возвращался после записи в журнал «Вызов Api для Zain», но undefined отображается перед это, но я не знаю почему, поэтому мне нужна помощь в этом.

Ответы [ 2 ]

3 голосов
/ 24 марта 2020

Вы должны вернуть заявление в вашем первом .then:

p.then(user => {
  console.log(user);
  return getRepositories(user.github);
}).then(repos => {
  console.log(repos);
});
0 голосов
/ 24 марта 2020

Существует специальный синтаксис для более удобной работы с обещаниями, который называется “async/await”. Это удивительно легко понять и использовать.

async function init() {
  console.log("Before");
  const user = await getUser(1);
  console.log(user);
  const repos = await getRepositories(user.github);
  console.log(repos);
  console.log("after");
}
init();

async function getUser(id) {
  return new Promise(function(resolve, reject) {
    setTimeout(() => {
      console.log("Calling a database " + id);
      resolve({ id: id, github: "Zain" });
    }, 2000);
  });
}

async function getRepositories(username) {
  return new Promise(function(resolve, reject) {
    setTimeout(() => {
      console.log(`Calling Api for ${username}`);
      resolve(["repo1", "repo2", "repo3"]);
    }, 2000);
  });
}

Для получения дополнительной информации: https://javascript.info/async-await

...