Ошибка Response.WriteBlock при использовании mootools в ASP JScript на стороне сервера - PullRequest
4 голосов
/ 04 ноября 2010

Сегодня я поигрался с Mootools 1.3 на стороне сервера.Его действительно приятно потратить на то, чтобы сделать его классическим ASP дружественным, но все еще полным добра (tm).

Показывая другу, на что способен Mootools, я натолкнулся на странную ошибку, связанную с ASP, которую я раньше не видел.

Microsoft JScript runtime error '800a138f'

'Response.WriteBlock(...)' is null or not an object

Код, который вызвал его, является одним из фантичных помощников Mootools «forEach»:

[1,2,3].each( function( i ) {
   Response.Write( "<b>" + i + "</b>, " );
});

Он действительно не любит этот код вообще.Я закомментировал Response.Write и имел пустой блок, и он все еще выдавал ошибку.Очень странно.Я знаю, что ASP выполняет некоторую магию оптимизации для группировки блоков html и блоков asp (отсюда и комментарий Reponse.WriteBlock), но не уверен, почему это применимо здесь.

Однако этот код будет выполняться:

var fruits = [];
fruits.push( "apples" );
fruits.push( "oranges" );

fruits.each( function( fruit ) {
  Response.Write( "<b>" + fruit + "</b>, " );
});

// As will this
var nums = [ 1,2,3,4,5 ];
nums.each( function(i) {
    Response.Write( "<b>" + i + "</b>" );
});

Кто-нибудь имеет какие-либо идеи, что происходит, чтобы вызвать эту ошибку?Я буду копать, но не знаю, смогут ли какие-нибудь ребята из JScript пролить немного света.Может быть, это просто причуда ASP?

[Обновление]

Странность продолжается, ей удалось заставить ее работать, но, похоже, она зависит от того, что предшествует каждому циклу.Итак, резюмируем, что это НЕ работает:

<%

[ 1,2,3,4,5 ].each( function(i) {
    Response.Write( "<b>" + i + "</b>" );
});

%>

Но это работает (обратите внимание только на добавление над ним строки var):

<%

var something = 1;

[ 1,2,3,4,5 ].each( function(i) {
    Response.Write( "<b>" + i + "</b>" );
});

%>

Очень странно.Должно быть что-то, что связано с тем, как ASP обрабатывает блоки, может быть, в парсере есть правило о блоках, начинающемся с (что будет выглядеть довольно случайным) оператора массива, или, по крайней мере, оно не должно быть запрограммировано на то, чтобы я это делалэто (я не думаю, что они представляли серверные mootools, когда)!Хотелось бы получить подробное объяснение, чтобы я мог лучше его избежать.

Ответы [ 2 ]

1 голос
/ 17 ноября 2010

Попробуйте изменить свой код на этот ...

<%

;[ 1,2,3,4,5 ].each( function(i) {
    Response.Write( "<b>" + i + "</b>" );
});

%>

Это просто догадка.


В общем, считается плохой практикой начинать строку или, особенно, файл с( или [ без собственной точки с запятой.Основная причина связана с конкатенацией ...

например,

//foo.js
1 + 1 == 2

//bar.js
("lol, string")

//foo.js + bar.js
1 + 1 == 2("lol, string") // TypeError: number is not a function

Поскольку bar.js не имеет возможности узнать, что в итоге может быть включено до него, оно всегда должно включать свою собственную; до ( т.е.

//bar.js
;("lol, string")

//foo.js + bar.js
1 + 1 == 2;("lol, string") // SUCCESS!!1!

Я догадываюсь, что что-то странное происходит на земле ASP.
Поскольку у нас нет доступа к исходному кодуJScript или самого ASP-фреймворка, чтобы не было уверенности в том, что происходит.

0 голосов
/ 07 ноября 2010

я никогда не видел response.writeblock в классическом asp,
это не должен быть response.write?

...