当条件为真时链承诺

谢尔盖·诺维科夫

我正在尝试使用 JS 通过 XHR 获取所有页面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递归承诺出现之前确实是不可能的。您必须将承诺转换为回调友好代码并使用回调进行递归。

但是,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返回承诺。所以现在你可以这样做:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

分割链时承诺链

来自分类Dev

分割链时承诺链

来自分类Dev

在条件为真时保持选项禁用

来自分类Dev

仅在条件为真时如何返回?

来自分类Dev

条件为真时退出内部循环

来自分类Dev

在条件为真时保持选项禁用

来自分类Dev

在某些条件为真时显示UITabBar

来自分类Dev

ifelse 在条件为真时返回 NA

来自分类Dev

当条件为真时 Ansible 跳过

来自分类Dev

蓝鸟承诺:嵌套或条件链

来自分类Dev

如果值为零时条件解析为真

来自分类Dev

当条件为真时使用C ++算法推进迭代器

来自分类Dev

条件为真时的错误表达式

来自分类Dev

反应:仅在条件为真时才渲染子代

来自分类Dev

ReactJS仅在条件为真时如何获取?

来自分类Dev

条件为真时,我的循环不会结束

来自分类Dev

条件为真时执行while循环不循环

来自分类Dev

SQL-仅在条件为真时执行“和”

来自分类Dev

条件为真时的ng样式更改背景

来自分类Dev

仅当2个条件为真时才显示字段?

来自分类Dev

仅当条件为真时如何创建 HTML

来自分类Dev

当条件为真时,ValidateScript 意外返回假

来自分类Dev

Pine 脚本 - 当多个条件为真时输入位置

来自分类Dev

仅当条件为真时,如何才能显示此跨度?

来自分类Dev

有条件的承诺链

来自分类Dev

为承诺链定义回退捕获?

来自分类Dev

链承诺与then()

来自分类Dev

承诺链

来自分类Dev

如果条件被跳过,即使条件为真