gpt4 book ai didi

javascript - 当条件为真时链式 promise

转载 作者:行者123 更新时间:2023-11-30 11:14:52 25 4
gpt4 key购买 nike

我正在尝试使用 JS Promise 获取通过 XHR 请求的所有页面。

对我来说,通过递归回调来实现这一点相对微不足道,但我如何通过 promises 实现这一点?

没有 promise 的简化示例:

class Foo {
getPages(callback, pagesCount)
{
if (typeof(pagesCount) === 'undefined') {
pagesCount = 0;
}

// Let's say its async XHR
window.setTimeout(() => {
++pagesCount;
// Let's say that in 90% of cases we will get a full page
if (Math.random() < 0.9) {
console.log('Page received!');
this.getPages(callback, pagesCount);
} else {
console.log('Last page received!');
callback(pagesCount);
}
}, 1000);
}

doStuff(pagesCount)
{
console.log('Total pages: ' + pagesCount);
}

run()
{
this.getPages(this.doStuff);
}
}

(new Foo()).run();

我正在努力实现类似的目标:

class Foo {
getPages()
{
...
}

doStuff(pagesCount)
{
console.log('Total pages: ' + pagesCount);
}

run()
{
this.getPages().then(this.doStuff);
}
}

(new Foo()).run();

最佳答案

async/await 出现之前,递归 promise 确实是不可能的。您必须将 promise 转换为回调友好代码,并使用回调进行递归。

但是,async/await 允许您做您想做的事:

async getPages(pagesCount)
{
if (typeof(pagesCount) === 'undefined') {
pagesCount = 0;
}

// Let's say its async XHR
while () {

// Call promisified XHR like this:
// xhrResult = await XHR();

// Call callback based XHR like this:
// xhrResult = await new Promise(function(ok,err){
// XHR(function (error, result) {
// if (error) {
// err(error)
// } else {
// ok(result)
// }
// });

if (Math.random() < 0.9) {
console.log('Page received!');
return await getPages(pagesCount);
} else {
console.log('Last page received!');
return pagesCount;
}
};
}

注意:所有标记为 async 的函数都会返回 promises。所以现在你可以这样做:

getPages(100).then(count => console.log(count + ' pages left'))

关于javascript - 当条件为真时链式 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52012787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com