Javascript 如何确保在返回值之前完成放大请求?

Javascript 如何确保在返回值之前完成放大请求?,javascript,ajax,caching,asynchronous,Javascript,Ajax,Caching,Asynchronous,在我的一个文件中,我打电话如下: var jobsString = getDropdownJobs(); 它调用此函数: function getDropdownJobs() { var jobsString = amplify.store("JobsList"); if (typeof jobsString === 'undefined') { // Amplify sends a request for getJobs, if it exists in

在我的一个文件中,我打电话如下:

var jobsString = getDropdownJobs();
它调用此函数:

function getDropdownJobs() {

    var jobsString = amplify.store("JobsList");

    if (typeof jobsString === 'undefined') {

        // Amplify sends a request for getJobs, if it exists in cache, it will return that value.
        // If it does not exist in cache, it will make the AJAX request.
        amplify.request("getJobs", function (data) {

            // Leave a blank option for the default of no selection.
            var jobsString = '<option value=""></option>';
            // Append each of the options to the jobsString.
            $.each(data.jobs, function () {
                jobsString += "<option " + "value=" + this.JobNo_ + ">" + this.JobNo_ + " : " + this.Description + this.Description2 + "</option>";
            });
            // Store the jobsString to be used later.
            amplify.store("JobsList", jobsString);

        });
    }
    return jobsString;

}
无论何时返回,它都是未定义的。我在AJAX定义中添加了“async:false”,它没有改变任何东西


在返回之前,我如何确保值在那里?

我不熟悉Amplify,但是说

通过
放大发出的请求。请求将始终异步解决

因此,您必须将回调传递到
getDropdownJobs
,在
jobsString
被填充后执行,任何依赖于该值的代码都会进入该回调


或者,您可以使用Amplify的发布/订阅系统在
jobsString
被填充时订阅一个事件,并在
getDropdownJobs

期间发布到该事件,如果我误解了您的问题,很抱歉,但每次您执行类似操作时,异步请求,您都需要等待答案。在我提出备选方案之前,我倾向于遵循一些快速提示:

  • 通常,像您的
    getJobsDropdown
    这样的方法不会返回任何内容,或者可能会返回承诺。请阅读或阅读本文,以获取关于这些承诺的更高级的资料
  • 您可以使用的最简单的东西是回调,它是
    getJobsDropdown
    调用程序上下文中的某个方法,您希望在其中处理数据。这将允许您在数据准备就绪时恢复程序
试试这个:

function getDropdownJobs(callback) {

    // some code (...)

    amplify.request("getJobs", function (data) {

       // your processing and when done
       callback();

    });
}
您可以在回调中传递数据。
getDropdownJobs
的一个常见调用是:

function processResults() { // This is your callback }

function getData() {

    // This is where you call getDropDownJobs
    getDropDownJobs(processResults);
}
这有用吗?我希望如此


干杯。

如果您正在使用jQuery,并且不介意将amplify与jQuery框架耦合,则可以使用此插件,允许您使用jQuery延迟对象:

以下是一篇包含一些背景信息和插件使用概述的文章:

看一看。
function processResults() { // This is your callback }

function getData() {

    // This is where you call getDropDownJobs
    getDropDownJobs(processResults);
}