LoadVars не ожидает загрузки данных - PullRequest
0 голосов
/ 08 июня 2009
variable = 0;

function change() {
 variable = 1;
}

go = newVars(); 
go.onLoad = function(success) {
 trace("#First");
 change();
}
go.load('http://www.stackoverflow.com/variables'); 

trace("#Second");
trace(variable); // output = 0;

Проблема в том, что он выполняет #Second до #First, что означает, что объект загружен не полностью, но, тем не менее, код продолжается. Есть ли способ справиться с этим? Я попытался использовать цикл while, но это уродливо и приводит к сбою флэш-памяти. Есть ли приличный способ справиться с этим, это связано с лучшей структурой кода / программным потоком или есть технический способ заставить его ждать? Также обратите внимание: этот код выполняется на стороне сервера, что означает, что кадры не задействованы.

UPDATE: Когда проекты становятся больше, это становится очень уродливо, особенно когда вы получаете многократные вещи с сервера, вам приходится использовать очень глубокое вложение, вы должны повторять один и тот же код, например, для покупки серийного номера:

a.onload() {


 if(moneyAmount > 10){

  b.onload(pay) {

   sendProduct();

   d.onload(serial) {

    print(serial);

   }

   d.load('www.so.com/getSerial');

}
  b.load('www.so.com/pay?amount=5');

 }else{

  c.onload(wallet) {

   displayWallet(wallet)

  }

  c.load('www.so.com/getWallet);

 }

}
a.load('www.so.com/checkMoneyAmount');

1 Ответ

1 голос
/ 08 июня 2009

Не нужно ждать, вот и вся причина, по которой они выставляют событие onLoad. Какой бы код вы не хотели выполнять после полной загрузки, вы должны поместить его в функцию onLoad.

- редактировать -

Это просто природа зверя. Javascript не является многопоточным, и вы не знаете, когда будут возвращены вызовы веб-службы, поэтому вы должны использовать асинхронную модель.

var bank = {
    onGetSerial: function(s) {
        print(serial);
    },

    onPay: function(pay) {
        sendProduct();
        d.load('www.so.com/getSerial');
    },

    onGetWallet: function(wallet) {
        displayWallet(wallet);
    },

    onCheckMoneyAmount: function(moneyAmount) {
        if (moneyAmount > 10) {
            b.load('www.so.com/pay?amount=5');
        } else {
            c.load('www.so.com/getWallet');
        }
    }
};

a.onLoad = bank.onCheckMoneyAmount;
b.onLoad = bank.onPay;
c.onLoad = bank.onGetWallet;
d.onLoad = bank.onGetSerial;

a.load('www.so.com/checkMoneyAmount');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...