Ответ 1
В общем, плохая идея. Позвольте мне рассказать вам, почему. JavaScript в браузере - это в основном однопоточный зверь. Подумайте об этом, это однопоточно в Node.js. Таким образом, все, что вы делаете, чтобы не "возвращаться" в тот момент, когда вы ожидаете, что удаленный запрос будет успешным или завершится неудачно, скорее всего, приведет к некоторому циклу для задержки выполнения кода после запроса. Что-то вроде этого:
var semaphore = false;
var superImportantInfo = null;
// Make a remote request.
$http.get('some wonderful URL for a service').then(function (results) {
superImportantInfo = results;
semaphore = true;
});
while (!semaphore) {
// We're just waiting.
}
// Code we're trying to avoid running until we know the results of the URL call.
console.log('The thing I want for lunch is... " + superImportantInfo);
Но если вы попробуете это в браузере, и звонок займет много времени, браузер подумает, что ваш код JavaScript застрял в цикле и вытащил сообщение на лице пользователя, давая пользователю возможность остановить ваш код. JavaScript поэтому структурирует его так:
// Make a remote request.
$http.get('some wonderful URL for a service').then(function (results) {
// Code we're trying to avoid running until we know the results of the URL call.
console.log('The thing I want for lunch is... " + results);
});
// Continue on with other code which does not need the super important info or
// simply end our JavaScript altogether. The code inside the callback will be
// executed later.
Идея состоит в том, что код в обратном вызове будет инициироваться событием всякий раз, когда возвращается служебный вызов. Потому что события обусловлены тем, как нравится JavaScript. Таймеры в JavaScript - это события, действия пользователей - события, HTTP/HTTPS-вызовы для отправки и получения данных, генерирующих события. И вы должны структурировать свой код, чтобы реагировать на эти события, когда они приходят.
Можете ли вы не структурировать свой код так, чтобы он думал, что canAccess является ложным до тех пор, пока не вернется вызов удаленной службы, и, возможно, он узнает, что это действительно правда? Я делаю это все время в коде AngularJS, где я не знаю, какой конечный набор разрешений я должен показать пользователю, потому что я еще не получил их или я не получил все данные для отображения в сначала. У меня есть значения по умолчанию, которые отображаются до тех пор, пока реальные данные не вернутся, а затем страница изменится на новую форму на основе новых данных. Двусторонняя привязка AngularJS делает это очень легко.