Javascript 等待$。每个,直到第一个队列未完成
下面是我的代码。如果我们使用set timeout函数,我们得到了所有数据,但我们没有使用,我们没有得到来自本地数据库的检查数据。我希望在代码中使用延迟和承诺。提前谢谢Javascript 等待$。每个,直到第一个队列未完成,javascript,promise,jquery-deferred,deferred,Javascript,Promise,Jquery Deferred,Deferred,下面是我的代码。如果我们使用set timeout函数,我们得到了所有数据,但我们没有使用,我们没有得到来自本地数据库的检查数据。我希望在代码中使用延迟和承诺。提前谢谢 function onclickToCall() { this.$('.check-list > .check-list-box').each(function (i) { var j = i + 1; var answer_req = $(this).a
function onclickToCall() {
this.$('.check-list > .check-list-box').each(function (i) {
var j = i + 1;
var answer_req = $(this).attr("data-isReq");
var checklist_guid = $(this).attr("data-guid");
var question_type = $(this).attr("data-type");
var yes_no = $("input:radio[name='radio_" + j + "']:checked").val();
var notes = $(this).find('#txtAreaNotes_' + j).val();
var attachment_url = $(this).find(".txtCameraImage").attr("data-path");
var appConfig = DriverConnectApp.State.get('config_settings');
var item = {};
item.checklist_guid = checklist_guid;
item.yes_no = yes_no;
item.attachment_url = attachment_url;
item.notes = notes;
if (question_type == 2) { // For Vehical visual inspection
var dataPromise = that.getInspectionData(checklist_guid);
dataPromise.done(function (response, vh_image) {
var inspectionItem = {};
inspectionItem.vh_url = vh_image;
inspectionItem.details = response;
item.vh_inspection = inspectionItem;
that.detailsArr.push(item);
});
} else {
item.vh_inspection = {};
that.detailsArr.push(item);
}
});
// after finish and push all data we need to call function here
test();
}
getInspectionData: function (checklist_guid) {
var that = this;
var deferred = $.Deferred();
that.dbchecklist.getVehicleInspectionlist(checklist_guid, function (data, res) {
var details = [];
if (data.length) {
var img = data[0].vh_image;
var arr = JSON.parse(data[0].vh_details);
for (var k = 0; k < arr.length; k++) {
var items = {};
items.number = arr[k].number;
items.notes = arr[k].notes;
items.attachment_url = arr[k].attachment_url;
details.push(items);
}
deferred.resolve(details, img);
} else {
deferred.resolve(details, img);
}
});
return deferred.promise();
}
函数onclickToCall(){
此.$('.check list>.check list box')。每个(函数(i){
var j=i+1;
var answer_req=$(this.attr(“数据isReq”);
var checklist_guid=$(this.attr(“数据guid”);
var question_type=$(this.attr(“数据类型”);
var yes_no=$(“输入:radio[name='radio_'+j+']:选中”).val();
var notes=$(this).find('#txtAreaNotes'+j).val();
var attachment_url=$(this.find(“.txtCameraImage”).attr(“数据路径”);
var appConfig=DriverConnectApp.State.get('config_settings');
var item={};
item.checklist\u guid=检查表\u guid;
item.yes\u no=yes\u no;
item.attachment\u url=附件\u url;
item.notes=注释;
如果(问题类型==2){//用于车辆目视检查
var dataPromise=that.getInspectionData(检查表\u guid);
dataPromise.done(功能(响应、vh_图像){
var-inspectionItem={};
inspectionItem.vh_url=vh_图像;
inspectionItem.details=响应;
item.vh_检验=检验项目;
推送(项目);
});
}否则{
项目.vh_检验={};
推送(项目);
}
});
//完成并推送所有数据后,我们需要在此处调用函数
test();
}
getInspectionData:函数(检查表\u guid){
var=这个;
var deferred=$.deferred();
that.dbchecklist.getVehicleInspectionlist(检查表guid、函数(数据、资源){
var详细信息=[];
if(数据长度){
var img=数据[0]。vh_图像;
var arr=JSON.parse(数据[0].vh_详细信息);
对于(变量k=0;kgetInspectionData
中的第一个问题是resolve只需要一个参数,因此您的img
不会通过Promise。第二个问题是,您似乎被误导了,但非常普遍的看法是,承诺会以某种方式使异步代码同步-在onclickToCall中test()
将在解决getInspectionData
中返回的任何承诺之前执行-请研究使用$。当等待承诺数组时,您需要在每个第三个问题的每次迭代中从dataPromise
中“构建”承诺数组,您在onclickToCall
中使用了一个名为的变量,该变量的值为
——但它并没有在任何地方声明,Resolve接受多个参数,它对我来说也起作用。问题是本地数据库字段类型问题。谢谢你的回答和给予的时间,非常感谢@Jaromandaxi如果resolve需要多个参数,那么它不是承诺的问题。getInspectionData
中的第一个问题是resolve只需要一个参数,所以你的img
不会通过承诺。第二个问题是,你似乎受到了误导,但承诺会以某种方式做出,这是一个非常普遍的观点异步代码同步-在onclickToCall
-test()
中,在解决getInspectionData
中返回的任何承诺之前,将执行这些承诺-请研究使用$。当等待承诺数组时,需要“构建”承诺数组从每个第三个问题的每次迭代中的dataPromise
中,您使用一个名为的变量,该变量在onclickToCall
中
——但它没有声明,因为resolve需要多个参数,它的工作对我来说也是本地数据库字段类型问题。谢谢你的回答和给予的时间,非常感谢@JaromandaXIf resolve需要多个参数那么这不是承诺