2016-05-20 3 views
1

У меня есть основная функция в транспортира виде:Как расширить область функциональной переменной в javascript?

this.getCurrentUrl = function() { 
    browser.getCurrentUrl().then(function(url){ 
     console.log('url : '+url); 
    }); 
}; 

Теперь есть способ, которым я могу получить доступ к «URL» за пределами внутреннего объема функции, потому что мне нужно, чтобы вернуть это значение в какой-то другой функции вызова вот этот. Мне нужно получить значение и вернуть его за пределы then(function(url){...}

+1

Я серьезно подозреваю, что реальный вопрос повторяется или «возвращает значение из функции асинхронизации» ... Пожалуйста, подтвердите, что в вашем примере нет асинхронного кода (желательно обновить код, чтобы удалить путаницу '.then (...)' if это так) –

+0

Протранслятор сам по себе асинхронный, так что да, это действительно –

+0

В принципе, вы не можете получить возвращаемое значение из этой функции, если оно совершает асинхронный вызов. Посмотрите на приведенные выше ссылки, чтобы функция, вызывающая эту функцию, ожидала асинхронного ответа. – UtsavShah

ответ

1

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 
+0

, так что я должен назвать getUrl() здесь? –

+0

проблема, с которой вы сталкиваетесь, заключается в том, что операция, которая получает URL-адрес, является асинхронной. Поэтому вы не можете просто сказать «var url = getCurrentUrl()». Вы должны либо использовать обратный вызов, либо сделать обратный вызов, чтобы сделать что-то с URL-адресом или использовать 2-й или 3-й подходы, которые потребуют проверки результата на некотором интервале, пока он не получит значение. –