首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步ajax调用的java脚本闭包

异步ajax调用的java脚本闭包
EN

Stack Overflow用户
提问于 2017-01-20 17:53:44
回答 1查看 35关注 0票数 0

我有像下面这样的数据和javascript两个循环和ajax来获取数据。这两个循环使用i j值时可以正常工作。但是,如果我在内部循环中添加ajax,请求将不会按顺序进行。我需要在循环序列中获取数据。我们如何才能做到这一点?

代码语言:javascript
运行
复制
var final = {};
final.reports = ['a','b','c']
final.clients = ['x','y']
final.reportDataJson = [];

for(var i=0;i<final.reports.length;i++){
        (function(i,reactthis){

            for(var j=0;j<final.clients.length;j++){
                (function(i,j,final){
                    console.log(i+" "+j+" "+final.clients[j])
                    // this shows correct i j values
                    $.ajax({
                        url: url,
                        cache: false,
                        success: function(html) {
                            var reportResponse = {
                                reportname : final.reports[i],
                                clientname : final.clients[j],
                                reporthtml : html,
                                reportgraph : ''
                            }
                            final.reportDataJson.push(reportResponse)
                            //console.log(i,j)
                            if( i == final.reports.length-1 && j == final.clients.length-1){

                                console.log(final.reportDataJson);

                            }
                        },
                        error: function(xhr, status, err) {
                            if( i == final.reports.length-1 && j == final.clients.length-1){
                            }
                        }
                    })              

                })
            }


        })(i,final);
    }
EN

回答 1

Stack Overflow用户

发布于 2017-01-20 18:32:24

您可以使用这样一个事实,即$.ajax通过$.when返回一个Promise,它等待多个Promise并按顺序返回已解析的值!

代码语言:javascript
运行
复制
var final = {};
final.reports = ['a', 'b', 'c'];
final.clients = ['x', 'y'];
final.reportDataJson = [];

$.when.apply($, [].concat.apply([], final.reports.map(function(report) {
    return final.clients.map(function(client) {
        return $.ajax({
            url: url,
            cache: false
        }).then(function(results) {
            var html = results[0];
            // results[0] is same as success: html argument
            // results[1] is textStatus
            // results[2] is jqXHR
            return {
                reportname: report,
                clientname: client,
                reporthtml: html,
                reportgraph: ''
            };
        });
    })
}))).then(function() {
    final.reportDataJson = [].slice.call(arguments);
    console.log(final.reportDataJson);
});

使用$.when.apply,因为$.when使用参数1..n作为promises

使用[].concat.apply“扁平化”嵌套的.map返回的数组数组

使用原生Promise,这会更容易一些

代码语言:javascript
运行
复制
Promise.all([].concat.apply([], final.reports.map(function(report) {
    // code unchanged from above ....
}))).then(function(results) {
    final.reportDataJson = results;
    console.log(final.reportDataJson);
});

Promise.all接受一个promises数组,它的.then回调接收单个参数,即这些promises的结果数组

看在ES2015+的份上

代码语言:javascript
运行
复制
Promise.all([].concat.apply([], final.reports.map(report => final.clients.map(client => $.ajax({
    url: url,
    cache: false
}).then(([html, status, jqXHR]) => ({
    reportname: report,
    clientname: client,
    reporthtml: html,
    reportgraph: ''
})))))).then(results => console.log(final.reportDataJson = results));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41760651

复制
相关文章

相似问题

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