我正在构建一个网络前端,用户应该能够选择一些图片并一次删除所有图片。所以我正在尝试这个:
function deletePic(){
var inputs = document.querySelectorAll("input[type='checkbox']");
var PicsForDelete =[];
for(var i = 0; i < inputs.length; i++) {
if(inputs[i].checked == true){
userPics_query.get(inputs[i].id, {
success: function(picForDelete) {
PicsForDelete.push(picForDelete);
alert(picForDelete.id +" " + PicsForDelete[i]);
},
error: function(picForDelete, error) {
alert("Error: " + error.code + " " + error.message);
}
});
}
}
destroyItAll(PicsForDelete);
}
function destroyItAll(PicsForDelete){
if(confirm("Press 'OK' to delete "+PicsForDelete.length +" pictures!")){
Parse.Object.destroyAll(PicsForDelete,{
success: function(myObject) {
alert(PicsForDelete.length + " Images successfully deleted!");
},
error: function(myObject, error) {
alert("Error: " + error.code + " " + error.message);
}
});
}
}
问题是我的脚本总是希望首先销毁它们,然后尝试从我的数据库中取出对象。所以它不会删除任何内容。
所以我的问题是,如何更改解析服务器的优先级调用?
使用 Promise 来处理请求。AJAX 请求是异步的,因此您必须异步处理它
var imgPromises = [];
for(var i = 0; i < inputs.length; i++) {
if(inputs[i].checked == true){
var imgForDelPromise = new Promise(function (resolve) {
userPics_query.get(inputs[i].id, {
success: function(picForDelete) {
resolve(picForDelete);
},
error: function(picForDelete, error) {
alert("Error: " + error.code + " " + error.message);
}
});
});
imgPromises.push(imgForDelPromise);
}
}
Promise.all(imgPromises).then(function (imgs) {
destroyItAll(imgs);
});
您需要处理get
请求的异步性质。最简单的解决方案是将您的呼叫包装在 Promise
,计算任务并在所有任务完成后resolve
Promise
。
我没有你所有的代码,所以这是伪代码,但它应该说明这一点:
function deletePic() {
var inputs = document.querySelectorAll("input[type='checkbox']");
var PicsForDelete = [];
// Promise
var promise = new Promise(function(resolve, reject) {
var fetching = 0;
for (var i = 0; i < inputs.length; i++) {
if (inputs[i].checked == true) {
//Count asynchronous tasks
fetching++;
userPics_query.get(inputs[i].id, {
success: function(picForDelete) {
PicsForDelete.push(picForDelete);
alert(picForDelete.id + " " + PicsForDelete[i]);
//Mark asynchronous task as done
fetching--;
//If all tasks done, resolve
if (fetching == 0) {
resolve();
}
},
error: function(picForDelete, error) {
alert("Error: " + error.code + " " + error.message);
}
});
}
}
//If no tasks registered, resolve immidiately
if (fetching == 0) {
resolve();
}
}).then(function() {
//When all asynchronous tasks is completed, call "destroyItAll"
destroyItAll(PicsForDelete);
});
}