首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个条件异步递归函数和jQuery承诺

多个条件异步递归函数和jQuery承诺
EN

Stack Overflow用户
提问于 2016-02-24 09:14:13
回答 1查看 615关注 0票数 0

我有一个复杂的递归javascript函数,它工作得很好,直到我需要开始使用异步函数(在本例中是jQuery.ajax)。我在下面包含了一些psuedo代码,给出了情况的要点。我希望使用承诺(而不是当前的回调)来实现这段代码,但无法解决如何处理递归和多个条件ajax调用。如果我正确理解承诺,它们允许您在异步调用返回时采取行动,但我如何处理下面的情况?

代码语言:javascript
复制
function wrapperFunction(success,error) {
    var level = 0;
    result = [];

    var innerFunction = function(info,result,success,error) {
        level++;

        jQuery.ajax({
            url: 'baseurl1' + info,
            success: parseData,
            error: error
        });

        function parseData(data) {
            data.forEach( function(item) {
                result.push(item.something);

                if ( item.info ) {
                    innerFunction(item.info, result, success, error);
                }
            });

            if ( data.condition ) {
                jQuery.ajax({
                    url: 'baseurl2' + info,
                    success: parseData2,
                    error: error
                });
            }

            function parseData2(data2) {
                data2.forEach(function(item2) {
                    if ( item2.condition ) {
                        jQuery.ajax({
                            url: 'baseurl3' + info,
                            success: parseData3,
                            error: error
                        });
                    }
                });
                function parseData3(data3) {
                    if ( data3.condition ) {
                        jQuery.ajax({
                            url: 'baseurl4' + info,
                            success: parseData4,
                            error: error
                        });
                    }
                    function parseData4(data) {
                        result.push(data2.something + data4.something);
                    }
                }
            }

            level--;
            if (level == 0 && success) {
                success(result);
            }
        }

    }

    innerFunction('rootinfo', result, success, error);   
}   

wrapperFunction(
    function(data) {
        // process success
    },
    function(err) {
        // handle errors
    }
}

正如我已经说过的,这只是伪代码。一开始,我从我的真实代码中提取了它,看看我是否能把我的头放在实际的结构上。我知道如果ajax调用是同步的,那么它就能工作,但是现在它们是异步的,它有时只起作用(取决于调用返回的速度)。

如何使用承诺来实现这种情况?

编辑

我刚刚想出了如何使用承诺来序列化所有东西,虽然这是等待一切完成的一种方法,但我宁愿并行运行多个调用,然后找到一种方法来等待一切完成。我知道这与承诺是可能的,但我不知道如何做到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-26 14:10:34

我已经让它发挥作用,在桑迪普纳亚克的帮助下(见上面的评论)。我想我会为遇到类似问题的人发布伪代码的工作版本。

我基本上增加了两个层次的承诺(外部和内部),其中外部承诺确实得到解决,如果所有的内在承诺被解决。可能还有整理代码的余地,但它可以按原样工作。

代码语言:javascript
复制
function wrapperFunction(success,error) {
    var level = 0;
    var result = [];
    var outerPromises = [];

    var innerFunction = function(info,result,success,error) {
        var outerPromise = new jQuery.Deferred();
        outerPromises.push( outerPromise );

        level++;

        jQuery.ajax({
            url: 'baseurl1' + info,
            success: parseData,
            error: error
        });

        function parseData(data) {
            data.forEach( function(item) {
                result.push(item.something);

                if ( item.info ) {
                    innerFunction(item.info, result, success, error);
                }
            });

            if ( data.condition ) {
                jQuery.ajax({
                    url: 'baseurl2' + info,
                    success: parseData2,
                    error: error
                });
            } else {
                outerPromise.resolve();
            }

            function parseData2(data2) {
                var innerPromises = [];

                data2.forEach(function(item2) {
                    var innerPromise = new jQuery.Deferred();
                    innerPromises.push( innerPromise );

                    if ( item2.condition ) {
                        jQuery.ajax({
                            url: 'baseurl3' + info,
                            success: parseData3,
                            error: error
                        });
                    } else {
                        innerPromise.resolve();
                    }

                    function parseData3(data3) {
                        if ( data3.condition ) {
                            jQuery.ajax({
                                url: 'baseurl4' + info,
                                success: parseData4,
                                error: error
                            });
                        } else {
                            innerPromise.resolve();
                        }
                        function parseData4(data) {
                            result.push(data2.something + data4.something);

                            innerPromise.resolve();
                        }
                    }
                });

                jQuery.when.apply(undefined, innerPromises).then( function() { outerPromise.resolve(); } );
            }

            level--;
            if (level == 0 && success) {
                jQuery.when.apply(undefined, outerPromises).then( function() { success(result); } );
            }
        }

    }

    innerFunction('rootinfo', result, success, error);   
}   

wrapperFunction(
    function(data) {
        // process success
    },
    function(err) {
        // handle errors
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35597818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档