Javascript: Выполнить и Куайн одновременно - PullRequest
0 голосов
/ 01 сентября 2010

У меня странная потребность здесь, и я не уверен в ее целесообразности. Я могу думать только о том, как бы это сделать, используя потоки (чтобы создать другой поток, который выполняет функцию Quine рядом с потоком, выполняющим сценарий, который я хочу Quine и выполняю одновременно (без добавления оповещений везде !!!), но JavaScript не имеет такой функциональности, верно?

У меня есть некоторый JavaScript, который интерпретируется приложением с минимальной собственной возможностью отладки JavaScript. Мой сценарий падает, и поскольку он также использует некоторые операторы, понятные только этому приложению, я не могу отладить его в Firefox или Internet Explorer, потому что они не могут обрабатывать эти пользовательские операторы. Надеюсь, я смогу достичь программы, которая может имитировать другую программу, но также выполнять свои собственные функции.

В качестве аргумента скажем, у меня есть скрипт с именем hello.js, который выводит "Hello World!" 100 раз, и когда оно предоставляется приложению, оно интерпретирует это, но в какой-то момент падает, но я не могу сказать, почему, где и когда из-за ограниченной возможности отладки.

function main(){
     for(var i=0; i<100; i++){
          alert('Hello World!\n');
     }
}

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

function main(){
     alert('main()')
     for(var i=0; i<100; i++){
          alert("alert('Hello World!\n');");
          alert('Hello World!\n');
     }
}

Однако я уверен, что вы понимаете, как для длинной программы это будет трудной задачей. Вместо этого я хочу создать программу, которая может работать так:

function main(){
     var text = loadJSScript("C:\\Script\\Hello.js"); //Loads a text/javascript file line by line into an array
     for(var i=0; i<text.length; i++){
          var statement = text[i];
          alert("Line Number: " + i + " Statement: " + statement); //Output the line number and statement before executing
          execute(statement); //A function that executes the statement from the other file (as if a separate thread)
     }
}

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Это действительно зависит от вашей целевой аудитории (использование браузера).

Вы можете получить очень эффективную форму псевдопоточности с помощью веб-работников.

http://ejohn.org/blog/web-workers/

Однако это широко не поддерживается.Вы можете использовать это там, где доступно.

Вы также можете получить некоторое поведение, похожее на многопоточность, используя setTimeout для выполнения кода.

Вы можете увидеть, как таймеры поставлены в очередь здесь: http://ejohn.org/blog/how-javascript-timers-work/

Вы также можете использовать сервер вычислений Quine и звонить, используя AJAX.Это дает асинхронный запрос.

Эти последние 2 параметра не являются многопоточными, но код не будет ждать ответа, прежде чем продолжить.

0 голосов
/ 01 сентября 2010

Насколько мне известно, JavaScript является чисто однопоточным.
Более того, оператор loadJSScript("C:\\Script\\Hello.js"); выглядит подозрительно, поскольку вы упоминаете браузеры. JS в браузерах (по крайней мере, на веб-страницах) не может получить доступ к файловой системе (кроме того, это не переносимо!).
Возможно, вы можете сделать что-то подобное в JScript от Microsoft (в WSH).

...