@Kaiido прав, здесь resolve
вызывается в цикле for, который находится повсюду и до того, как весь код завершится. Любая ошибка после этой точки в основном теряется.
Это анти-шаблон конструктора обещаний . Вкратце: не пишите код приложения внутри конструкторов обещаний. Не передавайте функции resolve
и reject
вниз. Вместо этого позвольте функциям возвращать обещания до вас и добавьте к ним весь код приложения в then
обратных вызовов. Затем верните все обещания, чтобы они образовали единую цепочку. Только тогда ошибки распространяются правильно.
См. Использование обещаний в MDN для получения дополнительной информации.
[..], Прототип не позволит элементу быть переключенным на видимый, если он был объявлен невидимый (
display: none
) с невстроенным CSS. Это - что-то, что я не понял и постоянно раздражен. Любой, который может обеспечить любое понимание его, получает большой upvote от меня.
Вы, вероятно, уже замеченный это, но документация для, например. show
(существуют другие связанные функции с тем же примечанием), указывает что:
Element.show
не могут элементы отображения, скрытые с помощью таблиц стилей CSS. Обратите внимание, что это не Опытное ограничение, а последствие как CSSdisplay
работы свойства.
Так, это - известная проблема, и они обвиняют CSS. Однако рассмотрите следующий документ (я не использовал Прототип прежде, таким образом, я не уверен - ли это рекомендуемый способ ожидать DOM для загрузки, но это, кажется, работает):
<!doctype html>
<script src="prototype.js"></script>
<script>
document.observe("dom:loaded", function() {
$("victim").show();
});
</script>
<style>
p#victim {display:none;}
</style>
<p id="victim">Hello world!
Как Вы уже знаете, это не будет работать. Почему? Ну, как Моделировал бы, знают, что "сбросить" display
свойство к тому, когда Вы говорите p#victim
кому: show
самостоятельно? (Другими словами: как может он узнавать то, что должно было быть значением display
если display: none
не присутствовал в ruleset с p#victim
селектор.) Ответ прост: это не может. (Думайте об этом в течение секунды. Что, если другой ruleset изменил бы значение display
если display: none
не присутствовал в нашем ruleset с p#victim
селектор? (Т.е. мы не можем принять это, например. p
всегда должен устанавливаться на block
, другой rulesets, возможно, изменил то значение.) Мы не можем удалить display
свойство от ruleset в таблице стилей, и мы не можем удалить все соединение между элементом и ruleset, потому что это может содержать другие свойства и так далее (даже если бы было бы возможно, что было бы, по моему скромному мнению, неочевидно найти который ruleset сделать это с). Конечно, мы могли продолжить и на это, но afaik, там не известное решение этой проблемы.)
Затем, почему встроенная альтернатива работает? Во-первых, позволяет взгляду на как show
реализован:
show: function(element) {
element = $(element);
element.style.display = ''; // <-- the important line
return element;
}
Afaict единственная важная вещь, которую делает эта функция, должен установить element.style.display
к пустой строке (''
), который "удаляет" display
от style
.Отлично! Но что это означает? Почему мы хотели бы удалить его?! Сначала мы должны узнать что element.style
на самом деле представляет и изменяет, когда мы изменяем его значения.
Документация MDC для element.style
состояния, что:
Возвращает объект, который представляет элемент
style
атрибут.
Отметьте последнее слово: атрибут. element.style
≠ текущий "расчетный" стиль для элемента, это - просто список свойств в style
атрибут (см. MDC для более длинного/лучше объяснения).
Рассмотрите следующий документ:
<!doctype html>
<script src="prototype.js"></script>
<script>
document.observe("dom:loaded", function() {
$("victim").show();
});
</script>
<p id="victim" style="display:none;">Hello world!
style="display:none;"
скрывается p#victim
но когда DOM заканчивают загружаться, Прототип изменит его на style=""
, и браузер повторно вычислит значение для display
свойство (значение из таблицы стилей браузера по умолчанию в этом случае).
Но, рассмотрите следующий документ:
<!doctype html>
<script src="jquery.js"></script>
<script>
$(document).ready(function(){
$("#victim").show();
});
</script>
<style>
p#victim {display:none;}
</style>
<p id="victim">Hello world!
jQuery обрабатывает материал таблиц стилей правильно, в этом случае так или иначе! Это не столь просто объяснить как Опытное решение и существует ко многим слоям великолепия для меня для прочтения прямо сейчас, и существует много случаев, где jQuery не удается вычислить правильное значение для display
. (Быстрое последнее примечание: Firebug..., но я предполагаю, что он использует некоторый Firefox эксклюзивный материал или что-то.)
Править: Извините (Отмечают к сам: RTFQ Грабят, sheesh!). Быстрый поиск с помощью Google покрыл дерном это и плагин jQuery, если это - какое-либо использование. Это в основном использует правила @media, но не встроенное насколько я могу сказать, таким образом, Ваша поддержка браузера может варьироваться, но лучше, чтобы можно было надеяться, поскольку я думаю :(
Посмотрите, работает ли это... Я думаю, что можно сделать это для каждого типа и просто проверить, если возвраты оператора, пустые или эквивалентные, то примените правила.
От этого сайта: http://www.webdeveloper.com/forum/showthread.php?t=82453
IE:
if (document.styleSheets[0].media == 'screen'){...}
FF/NS:
document.getElementsByTagName ('LINK')[0].getAttribute ('media')
или
document.styleSheets[0].media.mediaText
и сценарий, чтобы проверить его во все браузеры (за исключением некоторых новых, так быть осторожным :))
http://student.agh.edu.pl/~marcinw/cssmedia/
этот сценарий работает в операторе "if" истинной/ложной булевской переменной! Надежда Вы заставите это работать!
document.getElementsByTagName('link').each(function( link )
{
//do something with link.media
//hide whatever you need to hide, etc
});
Я протестировал свой упомянутый выше сценарий - он теперь работает со всеми новыми браузерами, включая финал IE8.
Сценарий переехал сюда: http://cssmedia.pemor.pl/ Не стесняется использовать его, если только Вы хотите.
С отношениями Marcin Wiazowski