when()then() - 延迟对象的多个链

时间:2014-03-12 20:53:58

标签: javascript jquery deferred

我想在jquery中做一个$ .when()。然后($ when()。then(...))的链。我不习惯推迟的功能,第一次使用它们。

我将代码改为代码以代表这种情况:

function setenum(e)
{
    return $.ajax({
        url: SetPathUrl1(),
        type: 'GET',
        data: { isNew: e.isNew() },
        contentType: 'application/json; charset=utf-8',
        success: function (data, status, xhr) {
            /*My stuff*/
        },
        error: function (xhr, status, error) {
            /*My stuff*/
        }
    });
}

function setdropdown1(e)
{
    return $.ajax({
            url: SetPathUrl2(),
            type: 'GET',
            data: { isNew: e.isNew() },
            contentType: 'application/json; charset=utf-8',
            success: function (data, status, xhr) {
                /*Fill my first ddl based on enum*/
            },
            error: function (xhr, status, error) {
                /*My stuff*/
            }
        });
}

function setdropdown2(e)
{
    return $.ajax({
            url: SetPathUrl3(),
            type: 'GET',
            contentType: 'application/json; charset=utf-8',
            success: function (data, status, xhr) {
                /*Fill my second ddl based on enum*/
            },
            error: function (xhr, status, error) {
                /*My stuff*/
            }
        });
}

function DoOtherStuff(e)
{
    /**/
}

function MainNotWorking(ImportantModel)
{
    $.when(setenum(ImportantModel))
    .then(
        $.when(setdropdown1(ImportantModel),setdropdown2(ImportantModel))
        .then(
            function () {
                DoOtherStuff(e);
            }
        )
        );
}

function MainWorking(ImportantModel)
{

    $.when(setenum(ImportantModel),setdropdown1(ImportantModel),setdropdown2(ImportantModel))
    .then(
        function () {
            DoOtherStuff(e);
        }
    );

}

MainNotWorking:订单根本没有得到尊重,有时会在setdropdown1之前调用setdropdown2setenum

MainWorking: 当我只有一个等级时,则在所有其他函数之前调用函数DoOtherStuff,但它只是一个级别。我想在setenumsetdropdown1之前做多个链setdropdown2,然后最后DoOtherStuff

2 个答案:

答案 0 :(得分:1)

使用$.when().done(callback)

function MainNotWorking(ImportantModel) {
    $.when(
        setenum(ImportantModel)
    ).done(function() {
        $.when(
            setdropdown1(ImportantModel), 
            setdropdown2(ImportantModel)
        ).done(DoOtherStuff);
    });
}

答案 1 :(得分:1)

首先,您应该将函数引用传递给then

.then(function() { ... })

您传递的内容会立即执行,而不是在第一个功能完成时执行。

仅此一点就足够了,但如果你想“扁平化”链接,你可以这样做:

$.when(
    setenum(ImportantModel)
).then(function() {
    return $.when(
        setdropdown1(ImportantModel),
        setdropdown2(ImportantModel)
    )
}).then(function() {
   DoOtherStuff(); 
});

以下是演示:http://jsfiddle.net/44e5Y/