Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 触发时如何传递参数?_Javascript_Jquery_Ajax_Triggers_Parameter Passing - Fatal编程技术网

Javascript 触发时如何传递参数?

Javascript 触发时如何传递参数?,javascript,jquery,ajax,triggers,parameter-passing,Javascript,Jquery,Ajax,Triggers,Parameter Passing,当我的JavaScript运行时,它将调用getDoctorComplete函数。当AJAX请求完成时,它将设置a=chelsea。否则,将有一个触发器更改,并将运行$('#dropdown_hosp')。更改(…。在$('#dropdown_hosp')。更改(…,它将调用getspeciality函数。当AJAX请求使用getspeciality函数完成时,我想获取a的值。Iconsole.log它,但它包含一个空字符串。如何解决此问题 var a = ''; $(document).rea

当我的JavaScript运行时,它将调用
getDoctorComplete
函数。当AJAX请求完成时,它将设置
a=chelsea
。否则,将有一个触发器更改,并将运行
$('#dropdown_hosp')。更改(…
。在
$('#dropdown_hosp')。更改(…
,它将调用
getspeciality
函数。当AJAX请求使用
getspeciality
函数完成时,我想获取
a
的值。I
console.log
它,但它包含一个空字符串。如何解决此问题

var a = '';
$(document).ready(function () {
    app.getHospital({
        areaId: ''
    });

    app.getDoctorComplete({
        doctorId: doctorId,
        doctorel: $('#dropdown_doct')
    });

    $('#dropdown_hosp').change(function () {
        var dropdownspecialty = $('#dropdown_spec');
        app.getSpecialty({
            hospitalId: $('#dropdown_hosp').val(),
            apiUrl: 'api',
            special: dropdownSpec
        });
    });
});

app = function () {
    function getHospital({
        areaId
    }) {
        // ...
        $.ajax({
            // ...
            success: function (result) {
                // ...
            },
            // ...
        }).done(function () {
            $('#dropdown_hosp').select2();
        });
    };

    function getSpecialty({
        hospitalId,
        apiUrl,
        special
    }) {
        // ...
        $.ajax({
            // ...
        }).done(function () {
            // test here
            console.log(a);
        });
    };

    function getDoctorComplete({
        schdoctor_id,
        doctorel
    }) {
        // ...
        $.ajax({
            // ...
            success: function (result) {
                // ...
            },
            // ...
        }).done(function () {
            // ...
            a = 'chelsea';
            b = '..';
            $('#dropdown_hosp').val(b).trigger('change');
        });
    };
    return {
        getSpecialty: getSpecialty,
        getDoctorComplete: getDoctorComplete
    }
}();

您的问题是,您的
ajax
调用是异步的,因此
a
在记录时不会被重新分配。下面是一个解决问题的方法,使用
Promise
,创建一个异步函数
resolve
,标记该异步函数和
返回值
在该异步函数之后执行以下操作:

var a = '';
$(document).ready(function () {
    app.getHospital({
        areaId: ''
    });

    app.getDoctorComplete({
        doctorId: doctorId,
        doctorel: $('#dropdown_doct')
    })
        .then(() => { // Add the .then() callback to do something after getDoctorComplete finished
            $('#dropdown_hosp').change(function () {
                var dropdownspecialty = $('#dropdown_spec');
                app.getSpecialty({
                    hospitalId: $('#dropdown_hosp').val(),
                    apiUrl: 'api',
                    special: dropdownSpec
                });
            });
        });
});

app = function () {
    function getHospital({
        areaId
    }) {
        return new Promise((resolve, reject) => {
            // ...
            $.ajax({
                // ...
                success: function (result) {
                    // ...
                },
                // ...
            }).done(function () {
                $('#dropdown_hosp').select2();

                resolve(); // Add resolve
            });
        });
    };

    function getSpecialty({
        hospitalId,
        apiUrl,
        special
    }) {
        return new Promise((resolve, reject) => {
            // ...
            $.ajax({
                // ...
            }).done(function () {
                // test here
                console.log(a);

                resolve(); // Add resolve
            });
        });
    };

    function getDoctorComplete({
        schdoctor_id,
        doctorel
    }) {
        return new Promise((resolve, reject) => {
            // ...
            $.ajax({
                // ...
                success: function (result) {
                    // ...
                },
                // ...
            }).done(function () {
                // ...
                a = 'chelsea';
                b = '..';
                $('#dropdown_hosp').val(b).trigger('change');

                resolve(); // Add resolve
            });
        });
    };
    return {
        getSpecialty: getSpecialty,
        getDoctorComplete: getDoctorComplete
    }
}();

您需要将ajax函数包装成一个
承诺
,在
done
方法中解析该承诺,并在调用后调用
。然后()
,如
app.getDoctorComplete(…)。然后(()=>{在调用后在此处执行操作})
。尝试添加回调,可能会有帮助。有没有更简单的方法?因为我的案例很复杂。我担心这会影响others@SuccessMan--理论上可以传递(回调)-函数作为每个函数的参数,并在
done
块中调用它。除此之外,我没有想到安全的解决方案。异步代码就是这样工作的,您应该习惯它,因为在处理Ajax请求时,没有办法绕过它(Ajax一词的字面意思是“asynchronous JavaScript and XML”@SuccessMan如果这解决了您的问题,请接受答案并自由投票。如果没有,请提供更多信息。