我如何使用第二个承诺?

How do I consume this second promise?

这是代码

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() 函数编辑的 return 承诺时遇到了问题。以上是我的实现,但它不起作用 returns undefined(而不是数组 [repo1, repo2, repo3])。

这是输出:

我希望数组在记录 "Calling Api for Zain" 后变为 return,但 undefined 显示在它前面,但我不知道为什么,所以我需要这方面的帮助。

您的第一个 .then:

中需要一个 return 语句
p.then(user => {
  console.log(user);
  return getRepositories(user.github);
}).then(repos => {
  console.log(repos);
});

有一种特殊的语法可以更舒适地处理 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