jquery等到方法执行完成

时间:2012-08-31 17:29:17

标签: jquery methods wait

我有一个按钮,点击我需要的按钮:

  • 执行方法
  • 需要显示弹出窗口。

代码是:

$('.dwnSingleImageLink').live('click', function(event){
    $('html, body').animate({scrollTop : 0}, 'slow');
    singleFileDownload = true;

    var renditions = getRenditionResultset($(this).attr('data-id'), $(this).attr('data-docname'));

    for(var i = 0; i < renditions.length; i++){
        var name = renditions[i].name;
        if(name == 'Web' || name == 'Thumbnail' || name == 'Preview' || name == 'Native File'){
            var info = {
                name: renditions[i].name,
                fileSize: renditions[i].fileSize,
                width: renditions[i].width,
                height: renditions[i].height,
                label: ''
            };
            renditionInfos.push(info);
        }
    }

    $('#downloadModal').find('input:hidden').attr({
            'data-id': $(this).attr('data-id'), 
            'data-docname': $(this).attr('data-docname'),
            'data-title': $(this).attr('data-title')
    }).after(function(){            
        $('#downloadModal').modal('show').css({
            width: '380px',
            'margin-left': function () {
                return - ($(this).width() / 2);
            }
        });
    });
});

var getRenditionResultset = function(dID, dDocName){
    var submitData = { 
        IdcService: 'RENDITION_INFO',
        dID: dID,
        dDocName: dDocName
    }; 

    var renditions = new Array();
    var fields = new Array();

    $.ucm.executeServiceIsJson(submitData, function(ucmResponse) {
        var resultSet = ucmResponse.ResultSets['manifest'];
        alert('jym');                                   

        for (var fieldIndex = 0; fieldIndex < resultSet.fields.length; fieldIndex++) {
            var field = new RenditionField();
            field.name = resultSet.fields[fieldIndex].name;
            field.index = fieldIndex;

            fields.push(field);
        }

        for(var rowIndex = 0; rowIndex < resultSet.rows.length; rowIndex++) {
            var rendition = new Rendition();

            for(var i = 0; i < fields.length; i++){
                var value = resultSet.rows[rowIndex][fields[i].index];                  

                switch(fields[i].name){
                    case 'extRenditionName' : 
                        rendition.name = value;
                        break;
                    case 'extRenditionDescription' :
                        rendition.description = value;
                        break;
                    case 'extRenditionPath' :
                        rendition.path = value;
                        break;
                    case 'extRenditionOriginalName' :
                        rendition.originalName = value;
                        break;
                    case 'extRenditionParams' :
                        rendition.params = value;
                        break;
                    case 'extRenditionType' :
                        rendition.type = value;
                        break;
                    case 'extRenditionFileSize' :
                        rendition.fileSize = value;
                        break;
                    case 'extRenditionWidth' :
                        rendition.width = value;
                        break;
                    case 'extRenditionHeight' :
                        rendition.height = value;
                        break;
                    case 'extRenditionFileType' :
                        rendition.fileType = value;
                        break;
                    case 'extRenditionPixelsPerInchVertical' :
                        rendition.pixelsPerInchVertical = value;
                        break;
                    case 'extRenditionPixelsPerInchHorizontal' :
                        rendition.pixelsPerInchHorizontal = value;
                        break;
                    case 'extRenditionColours' :
                        rendition.colours = value;
                        break;          

                }                   
            }

            renditions.push(rendition);
        }
    });

    return renditions;
}

function RenditionField() {
    this.name = '';
    this.index = -1;
}

function Rendition() {
    this.name = '';
    this.description = '';
    this.path = '';
    this.originalName = '';
    this.params = '';
    this.type = '';
    this.fileSize = '';
    this.width = '';
    this.height = '';
    this.fileType = '';
    this.pixelsPerInchVertical = '';
    this.pixelsPerInchHorizontal = '';
    this.colours = '';
}

Rendition.prototype.toString = function() {
    return '[object Rendition: name=' + this.name + ';description=' + this.description + ';path=' + this.path + ';originalName=' + this.originalName +
    ';params=' + this.params + ';type=' + this.type + ';fileSize=' + this.fileSize + ';width=' + this.width + ';height=' + this.height + ';fileType=' + 
    this.fileType + ';pixelsPerInchVertical=' + this.pixelsPerInchVertical + ';pixelsPerInchHorizontal=' + this.pixelsPerInchHorizontal + ';colours=' +
    this.colours + ']';
}

这是一个很大的代码。它的作用是,发送ajax请求并接收响应。然后它处理响应并创建一个数组。这些是方法getRenditionResultset()的工作。但是在我的应用程序生成数组之前,在这个方法的调用之下的for循环也得到了show modal块。我如何等待getRenditionResultset()方法的结束,然后执行for {和click处理程序的其余代码?在这种情况下有没有办法使用$.when()? 问候。

3 个答案:

答案 0 :(得分:1)

再接受一个回调作为getRenditionResultset方法的参数。

var getRenditionResultset = function(dID, dDocName, onComplete){ 

  $.ucm.executeServiceIsJson(submitData, function(ucmResponse) {
    //after creating the array with the reponse

    if(typeof onComplete === function){
       onComplete()
    }


  }
}

在调用时,请执行

$('.dwnSingleImageLink').on('click', function(event){
 .
 .
     var renditions = getRenditionResultset(blah, blah, function(){
        //code to execute after request has completed.
     }
 .
 .
}

答案 1 :(得分:0)

AJAX调用往往是异步的。因此,必须等待完成才能执行更多代码。幸运的是,jQuery为这样的任务提供了一种工具:它的AJAX方法采用了一些可选的回调参数。例如,在等待请求完成后执行以下代码:

$.ajax({
    "url": "http://example.com/ajax.php",
    "type": "post",
    "dataType": "json",
    "success": function(data) {
        // data is a json-decoded object.
    }
});

答案 2 :(得分:0)

您应该使用getRenditionResultSet中的AJAX成功回调来执行显示模态的调用后代码。

相关问题