繁体   English   中英

如何等待直到异步功能完成,然后继续循环?

[英]How to wait until the async function is done and then continue the cycle?

你们能帮我吗? 我需要等到异步功能在周期中完成,然后再继续周期。 我想获取附件文件的url,然后将其插入html。

 function getProjects(){ $.ajax({ url: "/_api/web/lists/getbytitle('Projects')/items?$orderby=Title asc", method: "GET", headers: { "accept": "application/json;odata=verbose" }, success: function (data){ var items = data.d.results; var result = ''; for (var i = 0; i < items.length; i++) { result += '<tr>'; result += '<td>'+items[i].Organization+'</td>'; result += '<td>'+items[i].Title+'</td>'; result += '<td>'+items[i].Contact+'</td>'; result += '<td>'+items[i].Description+'</td>'; result += '<td>'+items[i].Manager+'</td>'; result += '<td>'+items[i].Participates+'</td>'; getAttachments(items[i].Id).done(function(url){ console.log('1'); }); console.log('2'); result += '</tr>'; } $('#tableProjects').html(result); }, error: function (err) { alert(JSON.stringify(err)); } }); } 

有2个选项供您选择

a) 使用ajax参数async (不推荐这种方法)

   async : false

上面的参数将确保您的浏览器等待调用完成,然后继续进行。 从用户的角度来看,上述方法不好,因为如果您正在上载文件或请求花费很长时间,则对用户而言,它将显示已挂起浏览器

b) 在成功函数中编写完整代码 :这是遍历代码的更好方法,找到要在ajax调用后执行的代码段,然后将其粘贴到成功回调中。 这种方法似乎有点困难,但是一旦您习惯了这种方法,您将了解javascript中异步回调的功能。

好吧,我希望您可以使用$.when.then ,如下所示:

首先在函数内部声明一个布尔var

function getProjects(){
var valid=false;
$.when(
$.ajax({
            url: "/_api/web/lists/getbytitle('Projects')/items?$orderby=Title asc",
            method: "GET",
            headers: {
                "accept": "application/json;odata=verbose"
            },
            success: function (data){
                    dataObtained=data;
                    valid=true;
                }
                $('#tableProjects').html(result);   
            },
            error: function (err) {
                alert(JSON.stringify(err));
            }
        })).then(function(){
           if(valid)
           {
                var items = dataObtained.d.results;
                var result = '';
                for (var i = 0; i < items.length; i++) {
                    result += '<tr>';
                    result += '<td>'+items[i].Organization+'</td>';
                    result += '<td>'+items[i].Title+'</td>';
                    result += '<td>'+items[i].Contact+'</td>';
                    result += '<td>'+items[i].Description+'</td>';
                    result += '<td>'+items[i].Manager+'</td>';
                    result += '<td>'+items[i].Participates+'</td>';     
                    getAttachments(items[i].Id).done(function(url){
                        console.log('1');
                    });
                    console.log('2');
                    result += '</tr>';
            }
         });    
 }

我做到了! )))

 function uploader(i,items) { if( i < items.length ) { table += '<tr>'; table += '<td>'+items[i].Organization+'</td>'; table += '<td>'+items[i].Title+'</td>'; table += '<td>'+items[i].Contact+'</td>'; table += '<td>'+items[i].Description+'</td>'; table += '<td>'+items[i].Manager+'</td>'; table += '<td>'+items[i].Participates+'</td>'; getAttachments(items[i].Id).done(function(url){ table += '<td>'+url+'</td>'; table += '</tr>'; uploader(i+1,items); }); }else{ $('#tableProjects').html(table); } } function getProjects(){ $.ajax({ url: "/_api/web/lists/getbytitle('Projects')/items?$orderby=Title asc", method: "GET", headers: { "accept": "application/json;odata=verbose" }, success: function (data){ var items = data.d.results; table=""; uploader(0,items); }, error: function (err) { alert(JSON.stringify(err)); } }); } 

暂无
暂无

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

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