在执行任何其他操作之前,从$ .post设置变量

时间:2012-11-27 17:27:13

标签: javascript jquery ajax

我必须从数据库加载一些数组数据,我这样做:

var priorities, users;

$.post("http://"+ document.domain + "/priority",
                function(dat){
                priorities = dat;                       
});

$.post("http://"+ document.domain + "/users",
                function(dat){
                users= dat; 
});

然后我想在插件中使用这些变量,我意识到插件在设置此变量之前被触发,即使此代码位于JS文件的开头。

有没有更好的方法从数据库加载数据? 如果没有,我怎么能在执行任何其他代码之前设置这些变量?

感谢。

3 个答案:

答案 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()内访问它们。