Оболочка функции chrome.tabs.create, почему это работает?

У меня последняя версия Chrome, я создаю расширение.

Рассмотрим следующий код:

var returnTab = false; // init the variable as false

var createNewTab = function(){
returnTab = false; // make sure we start with this var as false

chrome.tabs.create({url:'http://www.google.com/'}, function(tab){
    returnTab = tab; // put the returntab object inside the variable
});

while(returntab===false){  }; // wait for the tab to be created.
return returnTab;
};
c = createNewTab();

Все в порядке, и это должно работать; за исключением того, что это не так. Функция createNewTab() застревает в бесконечном цикле, и переменная returnTab никогда не получает возвращаемое значение обратного вызова. Если я сделаю это так, как должен, без цикла ожидания все будет работать, и функция обратного вызова будет выполняться так, как должна.

Почему это не работает?

Л.Э.: Похоже, функция обратного вызова ожидает завершения цикла. Кто-нибудь знает способ, чтобы вся функция была занята, пока не сработает функция обратного вызова?


person Silviu-Marian    schedule 28.11.2011    source источник


Ответы (1)


Просто предполагаю, поскольку у меня нет реального опыта создания расширений Chrome, но, возможно, цикл while() перегружает поток и никогда не позволяет когда-либо запускать обратный вызов, указанный вами в вызове create(). Вот что произойдет, если вы сделаете это на обычном веб-сайте.

Попробуйте добавить вызов setTimeout() в цикл ожидания, чтобы во время ожидания он не использовал ЦП, а не использовал его на 100%... Я не уверен, как вы можете сделать это в контексте вашего расширения, код, который вы показали, не имеет достаточного контекста.

Однако, если бы я делал это, вместо того, чтобы зацикливаться и ждать, я бы просто добавил все, что вы хотите сделать, как только вкладка будет создана в функции обратного вызова (прямо там, где вы устанавливаете returnTab). Это нормальный способ делать вещи в JS...

person Daniel Magliola    schedule 28.11.2011
comment
Это верно, но вызов setTimeout не заставит функцию быть занятой, и функция вернет false. - person Silviu-Marian; 29.11.2011
comment
Опять же, у меня недостаточно контекста с этим кодом, чтобы понять, как вы могли бы это сделать... Но в любом случае вы не должны это делать. createTab запрашивает обратный вызов по какой-то причине. Вы должны делать все, что хотите, после возврата createTab, непосредственно внутри этой функции обратного вызова. - person Daniel Magliola; 29.11.2011
comment
Невозможно дождаться обратных вызовов внутри функции, не так ли? Я имею в виду, кроме определения фактического обратного вызова вне вызывающего абонента. Потому что, если это не так, мне может понадобиться очень широкий ЖК-дисплей. - person Silviu-Marian; 29.11.2011
comment
@ user608886, тот факт, что вам нужно держать функцию занятой, должен заставить что-то внутри вас кричать, что то, что вы пытаетесь сделать, просто крайне неправильно. Просто создайте свою программу для обработки асинхронных операций, и это не будет проблемой. Не пытайтесь красить стену молотком. - person Esailija; 29.11.2011
comment
Я не совсем уверен, что понимаю ваш вопрос... Если с помощью очень широкого ЖК-дисплея вы говорите об отступах... Просто определите функцию и вызовите ее из обратного вызова (или, может быть, обратный вызов БУДЕТ этой функцией, что бы ни делало больше смысл в вашем контексте) - person Daniel Magliola; 29.11.2011
comment
Я открыл другую тему со всей проблемой. Спасибо всем. - person Silviu-Marian; 29.11.2011