在我的一个档案中,我按如下方式拨打电话:
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”,它没有改变任何东西。
如何在返回之前确保值是否存在?
答案 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
这是一篇文章,其中包含一些背景信息和插件用法概述: