繁体   English   中英

如何在循环内将变量传递给ajax.done()?

[英]How to pass variable to ajax.done() inside a loop?

我想将变量传递给循环内发生的ajax调用的.done()。 这是我的原始代码:

    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js">    </script>
    </head> 

    <body>
        <div class="list">
            <div class="item" id="item1" data-user-id="1"></div>
            <div class="item" id="item2" data-user-id="2"></div>
            <div class="item" id="item3" data-user-id="3"></div>
            <div class="item" id="item4" data-user-id="4"></div>        
        </div>
        <script>           
            $('.list').children(".item").toArray().forEach(
                item => {            
                    $item = $(item)
                    $id = $item.data("userId")
                    $itemID = $item.attr('id')
                    $.ajax({
                        url: "https://jsonplaceholder.typicode.com/users",
                        data: { "id": $id },                    
                    }).done(res => {    
                        console.log($itemID)
                    });
                }
            );         
        </script>    
    </body>   
    item4
    item4
    item4
    item4

当我希望看到(以任何顺序)时:

    item1
    item2
    item3
    item4

我发现将变量传递给$ .ajax()。done(),但是2个解决方案都不起作用:

第一个使用立即调用的函数表达式:

    .done(
        ((result) => {                        
            console.log(result)
            console.log($itemID)
        })(res)
    );
    ReferenceError: res is not defined

第二个使用自定义ajax参数:

    $.ajax({
        url: "https://jsonplaceholder.typicode.com/users",
        data: { "id": $id },
        custom: $itemID   
        // same results with custom: { customID: $itemID }             
    }).done(res => {                        
        console.log(res)
        console.log(this.cutsom)
        // same output with console.log($itemID)
        //                  console.log(this.$itemID)
    });
    item4
    undefined
    item4
    undefined
    item4
    undefined
    item4
    undefined

我找到了其他两种也不起作用的解决方案(主要是使用不赞成使用的success属性)。 如果我错过了一个明显的答案,对不起,我已经尽力了。

看起来像一个范围问题。 您需要将$item$id$itemId的范围限制为foreach函数。

var $item = $(item);
var $id = $item.data("userId");
var $itemID = $item.attr('id');

否则, $itemID = ...的最后一次调用将在异步ajax函数完成时保留您的最后一个id

编写所需代码的最佳方法是将.ajax方法放在如下函数中。 这样,您将为变量定义范围。

 function req($id, $itemID) { $.ajax({ url: "https://jsonplaceholder.typicode.com/users", data: { "id": $id }, }).done(res => { console.log($itemID) }); } $('.list').children(".item").toArray().forEach( item => { $item = $(item) $id = $item.data("userId") $itemID = $item.attr('id') req($id, $itemID); } ); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="list"> <div class="item" id="item1" data-user-id="1"></div> <div class="item" id="item2" data-user-id="2"></div> <div class="item" id="item3" data-user-id="3"></div> <div class="item" id="item4" data-user-id="4"></div> </div> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM