0

我想声明一组空承诺
然后手动解决它们,但它不起作用?

const tab = [1]
let promises = tab.map(e => new Promise(() => { }))
setTimeout(() => {
  promises[0] = Promise.resolve()
}, 3000);
Promise.all(promises)
  .then(e => console.log("finished"))

不想这样做:

const tab = [1]
let promises = tab.map(e => new Promise((resolve) => { 
  setTimeout(() => {
    resolve()
  }, 3000);
}))

Promise.all(promises)
  .then(e => console.log("finished"))
4

2 回答 2

2

Thats the closest you can get:

const tab = [1]
let resolves = []
let promises = tab.map(e => new Promise((resolve) => {
   resolves.push(resolve)
}))
setTimeout(() => {
  resolves[0]()
}, 3000);
Promise.all(promises).then(e => console.log("finished"))
于 2021-10-10T10:58:35.610 回答
0

这是一种使用可重用deferred函数的技术,可让您从外部控制 Promise。我们扩展了两者resolve reject功能,允许更好地控制调用者。这是一种有点不合常规的模式,但以这种方式利用 Promise 有一些优势。有关详细示例,请参阅此问答-

function deferred () {
  let resolve, reject, promise = new Promise((res, rej) => {
    resolve = res; reject = rej
  })
  return { promise, resolve, reject }
}

const tasks = [ deferred(), deferred(), deferred() ] // 3 "deferrred" objects

Promise.all(tasks.map(t => t.promise)).then(console.log, console.error)

setTimeout(_ => tasks[0].resolve("one"), 1000)
setTimeout(_ => tasks[1].resolve("two"), 2000)
setTimeout(_ => tasks[2].resolve("three"), 3000)

于 2021-10-11T03:03:24.303 回答