我可以在另一个已解决的承诺中解决一个承诺吗?
Can I resolve a Promise inside another resolved Promise?
我正在编写一种方法来遍历一系列项目,以查找下一个未完成的项目或最后一个 returns 承诺的项目。
项目状态是通过另一种方法获取的,该方法也是 returns 一个承诺,我正在尝试 resolve/reject 在此方法的解析回调中。
下面是我尝试的简化版本:
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)
})
resolve/reject 回调似乎没有触发,我得到一个错误 Uncaught (in promise) no more entries
。
可能您必须调用 reject/resolve 进行嵌套迭代
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();
我正在编写一种方法来遍历一系列项目,以查找下一个未完成的项目或最后一个 returns 承诺的项目。
项目状态是通过另一种方法获取的,该方法也是 returns 一个承诺,我正在尝试 resolve/reject 在此方法的解析回调中。
下面是我尝试的简化版本:
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)
})
resolve/reject 回调似乎没有触发,我得到一个错误 Uncaught (in promise) no more entries
。
可能您必须调用 reject/resolve 进行嵌套迭代
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();