Javascript 等待$。每个,直到第一个队列未完成

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

下面是我的代码。如果我们使用set timeout函数,我们得到了所有数据,但我们没有使用,我们没有得到来自本地数据库的检查数据。我希望在代码中使用延迟和承诺。提前谢谢

 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;k
getInspectionData
中的第一个问题是resolve只需要一个参数,因此您的
img
不会通过Promise。第二个问题是,您似乎被误导了,但非常普遍的看法是,承诺会以某种方式使异步代码同步-在
onclickToCall中
test()
将在解决
getInspectionData
中返回的任何承诺之前执行-请研究使用
$。当
等待承诺数组时,您需要在每个第三个问题的每次迭代中从
dataPromise
中“构建”承诺数组,您在
onclickToCall
中使用了一个名为
的变量,该变量的值为
——但它并没有在任何地方声明,Resolve接受多个参数,它对我来说也起作用。问题是本地数据库字段类型问题。谢谢你的回答和给予的时间,非常感谢@Jaromandaxi如果resolve需要多个参数,那么它不是承诺的问题。
getInspectionData
中的第一个问题是resolve只需要一个参数,所以你的
img
不会通过承诺。第二个问题是,你似乎受到了误导,但承诺会以某种方式做出,这是一个非常普遍的观点异步代码同步-在
onclickToCall
-
test()
中,在解决
getInspectionData
中返回的任何承诺之前,将执行这些承诺-请研究使用
$。当
等待承诺数组时,需要“构建”承诺数组从每个第三个问题的每次迭代中的
dataPromise
中,您使用一个名为
的变量,该变量在
onclickToCall
——但它没有声明,因为resolve需要多个参数,它的工作对我来说也是本地数据库字段类型问题。谢谢你的回答和给予的时间,非常感谢@JaromandaXIf resolve需要多个参数那么这不是承诺