【问题标题】:How do I resolve the following promises? [duplicate]如何解决以下承诺? [复制]
【发布时间】:2022-01-03 18:46:17
【问题描述】:

我正在尝试解决 getABC 函数中的承诺,但本地 const 变量 b 返回未定义。如何实现 getB 函数使用的回调函数,使其返回值为 'B' 的解构数组项。

const [A, B, C] = ['A', 'B', 'C'];

function getA() {
  return A;
}

function getB(callback) {
  setTimeout(() => {
    callback(B);
  }, 10);
}

function getC() {
  return Promise.resolve().then(() => C);
}

function getABC() {
  return new Promise((resolve, reject) => {
    const a = getA();
    const b = getB(b => b);
    const c = getC().then(item => item).catch(err => console.log(err));

    resolve([a, b, c])
  });
}

getABC().then((arr) => console.log(arr));

【问题讨论】:

  • 您的getB 不会返回任何内容。你只需给它一个基本上什么都不做的回调。它只是在 10 毫秒后被调用。是否意味着 10 毫秒后真正解决承诺?
  • getB 是为了返回全局变量 B。
  • function getABC() { return Promise.all([getA(), new Promise(getB), getC()]); } 但实际上你应该只更改getB 的实现以返回承诺而不是接受回调。
  • 代码是针对编码挑战的,所以我没有写。
  • @MoonShine - “我正在尝试解决promise in” & “如何实现回调函数” - 它看起来像你是根据你的问题写的 - 不管怎样,Bergi 非常直接地回答了你写的问题。

标签: javascript function asynchronous callback


【解决方案1】:

您还必须将setTimeout 包装在Promise 中,并在resolve 之前调用Promise.all

const [A, B, C] = ['A', 'B', 'C'];

function getA() {
  return A;
}

function getB(callback) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(callback(B));
    }, 10);
  });
}

function getC() {
  return Promise.resolve().then(() => C);
}

function getABC() {
  return new Promise((resolve, reject) => {
    const a = getA();
    const b = getB(b => b);
    const c = getC().then(item => item).catch(err => console.log(err));

    resolve(Promise.all([a, b, c]));
  });
}

getABC().then(arr => console.log(arr));

如果您使用 async/await,所有这些都可以真正简化。

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 2020-09-07
    • 2016-06-13
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 2016-12-23
    相关资源
    最近更新 更多