我正在努力兑现承诺,并且取得了一些成功,但是现在我已经有了一个可以在承诺完成处理之前触发的事件。显然,我误解了触发器是什么,并且不胜感激以解决此问题。
这是我的代码:
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
中的.fail
和editPer
都在触发,指示已解决并拒绝了延期。
如何确保.done
仅在列表准备就绪(listPermissions
已运行完毕)时触发?
listPermissions
,因此我宁愿将listPermissions
和editPer
分开。而且,如果有一种更好的方法来实现这一目标,那我也有兴趣学习。
答案 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;
}