url будет приобретен как асинхронный, поэтому вы не можете просто назначить его. Вероятно, вы захотите передать обратный вызов.
function handleUrl(url) {
// here is where you do something with the url
}
// let your callback be called
this.getCurrentUrl = function(fn) {
browser.getCurrentUrl().then(function (url) {
fn(url);
})
}
// make the call with your handler
this.getCurrentUrl(handleUrl);
Другой подход заключается в том, чтобы ваша функция возвращала «контейнер» и которая накачивается позже. Затем вы можете проверить свой контейнер. Поскольку поведение является асинхронным, вы не будете знать, когда она будет готова, так что вы можете проверить его на интервал или что-то ...
// return a container object
this.getCurrentUrl = function() {
var urlContainer = {};
browser.getCurrentUrl().then(function (url) {
urlContainer.url = url;
});
return urlContainer;
}
var urlContainer = this.getCurrentUrl(); // starts off as an empty object
urlContainer.url // undefined
// then shortly in the future
urlContainer.url // has some url
Но третий способ вернуть укупорочные
this.getCurrentUrl = function() {
var urlValue;
browser.getCurrentUrl().then(function(url) {
urlValue = url;
});
return function() {
return urlValue;
}
}
var getUrl = this.getCurrentUrl();
getUrl(); // initially, returns undefined;
// keep trying. then shortly in the future...
getUrl(); // now has the url
Я серьезно подозреваю, что реальный вопрос повторяется или «возвращает значение из функции асинхронизации» ... Пожалуйста, подтвердите, что в вашем примере нет асинхронного кода (желательно обновить код, чтобы удалить путаницу '.then (...)' if это так) –
Протранслятор сам по себе асинхронный, так что да, это действительно –
В принципе, вы не можете получить возвращаемое значение из этой функции, если оно совершает асинхронный вызов. Посмотрите на приведенные выше ссылки, чтобы функция, вызывающая эту функцию, ожидала асинхронного ответа. – UtsavShah