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

时间:2012-11-14 20:53:22

标签: 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 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;

}

"GetJobs"的放大定义是:

amplify.request.define("getJobs", "ajax", {
    url: "../api/Job/Jobs",
    dataType: "json",
    type: "GET",
    cache: "persist"
});

每当它返回时,它都是未定义的。我在AJAX定义中放了“async:false”,它没有改变任何东西。

如何在返回之前确保值是否存在?

3 个答案:

答案 0 :(得分:1)

我不熟悉Amplify,但its API

  

通过amplify.request发出的请求将始终以异步方式解析

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

或者,您可以使用Amplify的发布/订阅系统订阅填充jobsString时的事件,并在getDropdownJobs期间发布到该事件。

答案 1 :(得分:0)

很抱歉,如果我误解了你的问题,但是每当你做这样的事情,异步请求时,你需要等待答案。在我提出一些替代方案之前,我倾向于遵循:

  • 通常像getJobsDropdown这样的方法不会返回任何内容,或者可能会返回承诺。请查看jquery promises或本文,了解有关chaining相同承诺的更多高级资料。
  • 您可以使用的最简单的事情是回调,在您要处理数据的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);
}

这有用吗?我希望如此。

干杯。

答案 2 :(得分:0)

如果你正在使用jQuery并且不介意使用jQuery框架耦合放大,你可以使用这个插件,允许你使用jQuery延迟对象:

amplify-request-deferred plugin

这是一篇文章,其中包含一些背景信息和插件用法概述:

Adding jQuery Deferred Support to AmplifyJS Request