函数和延迟jquery

时间:2013-10-14 09:27:54

标签: javascript jquery

你好我对这个论点很困惑:我知道在javascript函数中执行一个 有时是异步的方式,这是我的问题。我有一个名为

的函数
function createPopupHour() 

此函数创建一个html选择元素,它不会返回任何内容。我在请求的成功部分中在$ .AJAX请求中调用此函数。

$.ajax({
            url:"responseregistrodocente.php",
            data:{
                operazione:'caricaAssenza',
                idAssenza:id_array[3],
                codiceFiscale: id_array[0],
                data:id_array[1],
                tipo:id_array[2]
                },
            type:"POST",
            dataType:"json",
            success: function (jsonObject) {
            createPopupHourSelect()
            //other code
            }); 

            },
            error: function(error){
                //XMLREQQUESTOBJECT
                alert(error.responseText);
                location.reload();
            },
            cache:false,
            ifModified:false
        });

问题是当我调用该函数时,其他代码并没有注意到我的函数结束了。我知道在jquery中有" deferred Object",也许我需要我的函数创建一个延迟对象,并将其返回给代码。但是sintax怎么样?还是有另一个更简单干燥的解决方案???

这是正确的吗?

function createPopupHour select(){ //staff to do
return $.deferred();//it's in pending state
}

和$ .ajax

$.ajax({
                url:"responseregistrodocente.php",
                data:{
                    operazione:'caricaAssenza',
                    idAssenza:id_array[3],
                    codiceFiscale: id_array[0],
                    data:id_array[1],
                    tipo:id_array[2]
                    },
                type:"POST",
                dataType:"json",
                success: function (jsonObject) {
                var defered=createPopupHourSelect()
                defered.then(function{//other code])
                        defered.resolve();
                }); 

                },
                error: function(error){
                    //XMLREQQUESTOBJECT
                    alert(error.responseText);
                    location.reload();
                },
                cache:false,
                ifModified:false
            });

1 个答案:

答案 0 :(得分:1)

是的,other code需要驻留在弹出事件完成时将执行的回调函数中,就像ajax完成时执行弹出启动代码一样。您可以使用原始回调,也可以使用功能更强大的promise模式。

jQuery Deferred objects的语法是

function …() {
    var def = $.Deferred();
    // start asynchronous task
         // when the task is done (in the future), call
         def.resolve(…); // optionally with results
    // and right now do
    return def.promise();
}

由于$.ajax确实也会返回一个承诺,您可以通过.then使用链接(假设createPopUpHourSelect符合上述模式):

$.ajax({
    url:"responseregistrodocente.php",
    data:{…},
    type:"POST",
    dataType:"json",
    cache:false,
    ifModified:false
})
.fail(function(error){
    alert(error.responseText);
    location.reload();
})
.then(createPopupHourSelect) // gets passed the parsed JSON
.then(function(result) { // gets passed the resolve arguments from the popup
    // other code
});

如果您在其他代码中也需要ajax响应,并且不想通过弹出功能传递它,请使用

.then(function(json) {
    return createPopupHourSelect(…)
    .then(function(popupResults) {
         // other code
    });
}) /* returns a promise that resolves with result of other code
.then(…) */