如何在 javascript 中更改解析服务器中调用的优先级



我正在构建一个网络前端,用户应该能够选择一些图片并一次删除所有图片。所以我正在尝试这个:

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);
  });
}

最新更新