我必须从数据库加载一些数组数据,我这样做:
var priorities, users;
$.post("http://"+ document.domain + "/priority",
function(dat){
priorities = dat;
});
$.post("http://"+ document.domain + "/users",
function(dat){
users= dat;
});
然后我想在插件中使用这些变量,我意识到插件在设置此变量之前被触发,即使此代码位于JS文件的开头。
有没有更好的方法从数据库加载数据? 如果没有,我怎么能在执行任何其他代码之前设置这些变量?
感谢。
答案 0 :(得分:1)
$.post("http://"+ document.domain + "/priority",
function(priorities){
$.post("http://"+ document.domain + "/users",
function(users){
DoSomething(priorities, users);
});
});
function DoSomething(priorities, users){
// User Priorities and Users here
}
其他选项是同步调用ajax,但我不建议:)
编辑:
var priorities, users;
function getPriority(){
$.post("http://"+ document.domain + "/priority",
function(dat){
priorities = dat;
});
}
function getUsers(){
$.post("http://"+ document.domain + "/users",
function(dat){
users= dat;
});
}
var dfd = $.Deferred();
dfd
.done([getPriority, getUsers])
.done(function() {
//here you will have priorities and users
});
dfd.resolve();
答案 1 :(得分:1)
您可能希望使用控制流库,我个人喜欢使用异步https://github.com/caolan/async,它可以在浏览器和服务器端运行。
使用Async
async.waterfall([
function(callback){
$.post("http://"+ document.domain + "/priority", function(dat){
callback(null, dat);
});
},
function(priorities, callback){
$.post("http://"+ document.domain + "/users", function(dat){
callback(null, priorities, dat);
});
}
], function (err, priorities, users) {
//work with users & priorities
});
使用回调
$.post("http://"+ document.domain + "/priority", function(priorities){
$.post("http://"+ document.domain + "/users", function(users){
//work with users & priorities
});
});
您遇到问题的原因是因为ajax操作是异步执行的,因为代码不会等待操作完成,而是触发回调。
答案 2 :(得分:1)
听起来你想要jQuery 延迟对象。
var priorities, users;
$.when(
$.post("foo", function(data) { priorities = data; } ),
$.post("bar", function(data) { users = data; } )
).done(function() {
someFunction(priorities, users); // Call your function. Values are set!
})
只有在解决了所有someFunction
功能后,才会调用post()
。然后,您可以将post()
函数中收到的数据存储在更高的范围内,并在someFunction()
内访问它们。