0

DBからいくつかのデータ配列をロードする必要があり、次のようにしていました:

var priorities, users;

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

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

次に、プラグイン内でこの変数を使用したいのですが、このコードが JS ファイルの先頭にある場合でも、この変数が設定される前にプラグインが起動されることに気付きました。

DB からデータの配列をロードするより良い方法はありますか? 存在しない場合、他のコードが実行される前にこの変数を設定するにはどうすればよいですか?

ありがとう。

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

制御フロー ライブラリを使用することをお勧めします。個人的には、ブラウザーとサーバー側の両方で機能する async 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 deferred objectsが必要なようです。

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 に答える