为什么我的.done在承诺完成之前触发?

时间:2019-03-15 18:31:10

标签: promise

我正在努力兑现承诺,并且取得了一些成功,但是现在我已经有了一个可以在承诺完成处理之前触发的事件。显然,我误解了触发器是什么,并且不胜感激以解决此问题。

这是我的代码:

function editPer () {
    // load permissions from server
    $.when(loadPermissions())
    .done( function () {
        // display returned data
        console.log('done');
        console.log(permissions);
    })
    .fail(console.log('fail'));
} // end function editPer

function loadPermissions () {
    $.ajax({
        type: "POST",
        url:  "server/permissions.php",
        data: {action:'list',acc:33},
        dataType: 'json',
        success: function(data){
            console.log(data);
            listPermissions(data);
        } // end success function
    }); // end ajax
} // end function loadPermissions

function listPermissions (data) {
    status = data.status;
    if (status == 'LISTREADY') // list successful
    {
        // create list
        permissions = data.list; 
    }
} // end function listPermissions

loadPermissions成功运行,并将数据传递到listPermissions,后者创建列表(只有一个条目)。在列表准备好之前,我的editPer函数应该不会处理,但是当我尝试输出列表时,它是空的。

让我进一步困惑的是,.done中的.faileditPer都在触发,指示已解决并拒绝了延期。

如何确保.done仅在列表准备就绪(listPermissions已运行完毕)时触发?

可以从其他函数中调用

listPermissions,因此我宁愿将listPermissionseditPer分开。而且,如果有一种更好的方法来实现这一目标,那我也有兴趣学习。

1 个答案:

答案 0 :(得分:0)

应该延迟when的参数,但是实际上您传递undefined,因为函数loadPermissions不会返回任何内容。

推迟返回是对$.ajax的调用返回的返回值,因此...返回它:

return $.ajax({ // ...

第二,您的fail处理函数不是函数,因为您立即执行console.log。应该是:

.fail(function () {
    console.log('fail');
});

我应该提到,使用全局变量(permissions)并不是最佳实践。您可能希望让延迟的解析为这些值,而不是将它们作为全局值。

这是它的外观:

function editPer () {
    loadPermissions().then(function (permissions) {
        console.log('then');
        console.log(permissions);
    }).catch(function(error) {
        console.log('catch: ' + error);
    });
}

function loadPermissions () {
    return $.ajax({
        type: "POST",
        url:  "server/permissions.php",
        data: {action:'list',acc:33},
        dataType: 'json',
    }).then(function(data){
        return listPermissions(data);
    });
}

function listPermissions (data) {
    // Throwing error will make the promise reject and execute the catch callback
    if (data.status != 'LISTREADY') throw "not ready";
    return data.list; 
}