0

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

var priorities, users;

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

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

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

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

谢谢。

4

3 回答 3

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();
于 2012-11-27T17:31:31.003 回答
1

你会想使用一个控制流库,我个人喜欢使用异步https://github.com/caolan/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 操作是异步执行的,因为代码不会等待操作完成,而是触发回调。

于 2012-11-27T17:36:49.487 回答
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().

于 2012-11-28T11:32:29.280 回答