Используйте функцию callback()
внутри успеха foo()
. Попробуйте таким образом. Это просто и легко понять. & nbsp;
var lat = "";
var lon = "";
function callback(data) {
lat = data.lat;
lon = data.lon;
}
function getLoc() {
var url = "http://ip-api.com/json"
$.getJSON(url, function(data) {
callback(data);
});
}
getLoc();
Скрипты и рендеринг выполняются в одном потоке. Это означает, что doThis
будет завершен до начала рендеринга. Между тем, вы установили внутренний HTML в 'b', и это будет единственным результатом, который вы увидите.
Чтобы исправить это, вы должны завершить первый суб и вызвать intensiveOperation
с короткой задержкой и сделать окончательное обновление HTML в конце второго юнита, например:
Sub doThis
statusinfo.InnerHTML = "a"
Call window.setTimeout(GetRef("intensiveOperation"), 4)
End Sub
Sub intensiveOperation()
'takes long
statusinfo.InnerHTML = "b"
End Sub
Завершение doThis
освободит поток. Обратите внимание, что setTimeout
не остановит выполнение, весь юг будет выполнен до конца. После этого браузер может отобразить страницу.
intensiveOperation
вызывается в какой-то момент после завершения рендеринга, не раньше, чем данная задержка, но, возможно, намного позже, в зависимости от задач, которые CPU делает в это время .
Ответ на вопрос в заголовке вопроса в основном: никогда.