【问题标题】:Can I resolve a Promise inside another resolved Promise?我可以在另一个已解决的 Promise 中解决一个 Promise 吗?
【发布时间】:2019-05-30 15:44:48
【问题描述】:

我正在编写一个方法来遍历一系列项目以查找下一个不完整或最后一个返回承诺的项目。

项目状态由另一个方法获取,该方法也返回一个承诺,我试图在此方法的解析回调中解析/拒绝。

我的尝试的简化版本如下:

export const findNextEntry = (i) => {
  let length = entries.length
  let entry = entries[i]
  entry.isLastEntry = i + 1 >= length

  return new Promise((resolve, reject) => {
    getEntryStatus(i).then(() => {
      if (entry.status.complete) {
        if ((i + 1) < length) {
          findNextEntry(i + 1)
        } else {
          reject('no more entries')
        }
      } else {
        resolve('entry set')
      }
    })
  })

然后我调用方法:

findNextEntry(entry.number).then((resolve) => {
   console.log(resolve)
}, (reject) => {
   console.log(reject)
})

解决/拒绝回调似乎没有触发,我收到错误Uncaught (in promise) no more entries

【问题讨论】:

标签: javascript es6-promise


【解决方案1】:

您可能必须为嵌套迭代调用拒绝/解析

export const findNextEntry = (i) => {
  let length = entries.length
  let entry = entries[i]
  entry.isLastEntry = i + 1 >= length

  return new Promise((resolve, reject) => {
    getEntryStatus(i).then(() => {
      if (entry.status.complete) {
        if ((i + 1) < length) {
          findNextEntry(i + 1).then(resolve).catch(reject)
        } else {
          reject('no more entries')
        }
      } else {
        resolve('entry set')
      }
    })
  })

类似但更简单的代码

function test(i = 0) {
    console.log(i);
    return new Promise((resolve, reject) => {
        if (i < 10) test(i + 1).then(resolve).catch(reject);
        else resolve('done');
    });
}


test();

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2019-08-03
    • 2018-01-24
    • 1970-01-01
    • 2017-10-24
    • 2016-10-26
    • 2016-01-20
    • 1970-01-01
    相关资源
    最近更新 更多