Return 通过同步聚合函数调用来实现承诺,使用 setTimeout 驱动回调,基于承诺

Return Promise by Aggregating function calls by synchronous, callback driven using setTimeout, promise based

如何传递等待 setTimeout 完成的回调和 return 承诺。

当从函数传递回调时,在 setTimeout

之后解析函数时,是否可以在此处进行任何调整来解决此问题

或在 promise.all() 之前调用 getB 并准备好结果等

function getA() {
  return "A";
}
function getB(callback) {
  setTimeout(() => {
    callback("B");
  }, 10);
}

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

function getABC() {
  //need to work here only
  const cb = (val) => val;
  return Promise.all([getA(), getB(cb), getC()]);
}

getABC().then((arr) => console.log(arr));
// expected output [ 'A', 'B', 'C' ]

预期输出为 [ 'A', 'B', 'C' ] 但收到 [ 'A', undefined, 'C' ] 我应该在此处进行哪些更改?

更新以响应

TS Playground

function getA () {
  return "A";
}

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

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

function getABC () {
  const waitForCallback = (invoker) => new Promise(resolve => invoker(resolve));
  return Promise.all([getA(), waitForCallback(getB), getC()]);
}

getABC().then(console.log);


原回答:

Return 来自 getB 的承诺:

TS Playground

function getA () {
  return "A";
}

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

function getC () {
  return Promise.resolve("C");
}

function getABC () {
  const cb = (val) => val;
  return Promise.all([getA(), getB(cb), getC()]);
}

getABC().then(console.log.bind(console));