我如何履行第二个承诺?

时间:2020-03-24 18:03:46

标签: javascript es6-promise asynchronous-javascript

这是代码

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()函数返回的promise时遇到麻烦。上面是我的实现,但是不起作用,并且返回undefined(而不是数组[repo1, repo2, repo3])。

以下是输出:
enter image description here

我希望数组在记录“ Calling Api for Zain”之后返回,但是前面显示了undefined,但是我不知道为什么,所以我需要有关此的帮助。

2 个答案:

答案 0 :(得分:3)

您的第一个.then中需要一个return语句:

p.then(user => {
  console.log(user);
  return getRepositories(user.github);
}).then(repos => {
  console.log(repos);
});

答案 1 :(得分:0)

有一种特殊的语法可以更舒适地与promise结合使用,称为“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