Обработка события JavaScript и управление потоком

Я просто хотел обеспечить обновление на том, что мы на самом деле решили сделать для решения вопросов SFTP в SSIS. Вот разбивка того, что произошло:

  1. я первоначально пытался использовать Шпаклевку и некоторые пакетные файлы для загрузки файлов, но было трудно зафиксировать ошибки. Кроме того, я хранил наши учетные данные SFTP в файлах открытого текста, так как это была часть сценариев загрузки Шпаклевки.

  2. Мы купили лицензию CozyRoc на наш сервер SSIS за пару сотни долларов в год, и я полностью satisified с результатами использования их продукта. С продуктом CozyRoc задача потока управления повышает ошибки, если существуют какие-либо проблемы с загрузкой. Так как у меня также есть несколько младших программистов SSIS в моей команде, для них было легче понять, как установить задачу потока управления, чем использовать метод сценариев Шпаклевки. И наконец, пароль шифруется с помощью собственного шифрования SSIS для защиты уязвимых данных. У меня больше нет паролей, сохраненных в открытом тексте на моем сервере.

я действительно рассматривал некоторые из других сторонних библиотек, которые рекомендовались в этом вопросе, но кажется, что CozyRoc был самым дешевым из поставщиков, и у них также было несколько других задач SSIS, которые я был в состоянии использовать в своей команде BI. Спасибо, CozyRoc!

5
задан Raidri supports Monica 4 June 2014 в 11:37
поделиться

7 ответов

In JavaScript, you give up control of the main loop. The browser runs the main loop and calls back down into your code when an event or timeout/interval occurs. You have to handle the event and then return so that the browser can get on with doing other things, firing events, and so on.

So you cannot have a ‘listening’ loop. The browser does that for you, giving you the event and letting you deal with it, but once you've finished handling the event you must return. You can't fall back into a different loop. This means you can't write step-by-step procedural code; if you have state that persists between event calls you must store it, eg. in a variable.

This approach cannot work:

<input type="text" readonly="readonly" value="" id="status" />

var s= document.getElementById('status');
s.value= 'Press A now';
while (true) {
    var e= eventLoop.nextKeyEvent(); // THERE IS NO SUCH THING AS THIS
    if (e.which=='a')
        break
}
s.value= 'Press Y or N';
while (true) {
    var e= eventLoop.nextKeyEvent();
    if (e.which=='y') ...

Step-by-step code has to be turned inside out so that the browser calls down to you, instead of you calling up to the browser:

var state= 0;
function keypressed(event) {
    var key= String.fromCharCode(event? event.which : window.event.keyCode); // IE compatibility
    switch (state) {
        case 0:
            if (key=='a') {
                s.value= 'Press Y or N';
                state++;
            }
            break;
        case 1:
            if (key=='y') ...
            break;
    }
}

s.value= 'Press A now';
document.onkeypress= keypressed;

You can also make code look a little more linear and clean up some of the state stuff by using nested anonymous functions:

s.value= 'Press A now';
document.onkeypress= function(event) {
    var key= String.fromCharCode(event? event.which : window.event.keyCode);
    if (key=='a') {
        s.value= 'Press Y or N';
        document.onkeypress= function(event) {
            var key= String.fromCharCode(event? event.which : window.event.keyCode);
            if (key=='y') ...
        };
    }
};
8
ответ дан 13 December 2019 в 22:12
поделиться

Для упрощения реализация обработки событий. Я рекомендую вам использовать такую ​​библиотеку, как Prototype или JQuery (обратите внимание, что обе ссылки ведут к соответствующей документации по обработке событий.

Для их использования вы должны иметь в виду три вещи:

  • Какой элемент DOM вы хотите наблюдать
  • Какое событие вы хотите зафиксировать
  • Какое действие вызовет событие

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

Имея это в виду,используя Prototype, вы можете сделать это:

Event.observe($('id_of_the_element_to_observe'), 'keypress', function(ev) {
  // the argument ev is the event object that has some useful information such
  // as which keycode was pressed.
  code_to_run;
});

Вот код более полезного примера, CharacterCounter (такого, как тот, который можно найти в Twitter, но, безусловно, намного менее надежен;)):

var CharacterCounter = Class.create({

  initialize: function(input, counter, max_chars) {
    this.input = input;
    this.counter = counter;
    this.max_chars = max_chars;
    Event.observe(this.input, 'keypress', this.keyPressHandler.bind(this));
    Event.observe(this.input, 'keyup', this.keyUpHandler.bind(this));
  },

  keyUpHandler: function() {
    words_left = this.max_chars - $F(this.input).length;
    this.counter.innerHTML = words_left;
  },

  keyPressHandler: function(e) {
    words_left = this.max_chars - $F(this.input).length;
    if (words_left <= 0 && this.allowedChars(e.keyCode)) {
      e.stop();
    }
  },

  allowedChars: function(keycode) {
    // 8: backspace, 37-40: arrow keys, 46: delete
    allowed_keycodes = [ 8, 37, 38, 39, 40, 46 ];
    if (allowed_keycodes.include(keycode)) {
      return false;
    }
    return true
  }

});
1
ответ дан 13 December 2019 в 22:12
поделиться

вы не должны использовать такие циклы в javascript. в основном вы не хотите, чтобы браузер не выполнял свою работу. Таким образом, вы работаете с событиями (onkeyup / down).

также вместо цикла вы должны использовать setTimeout, если вы хотите немного подождать и продолжить, если что-то произошло

вы можете делать что-то вроде этого:

<html>
<script>
var dataToLoad = new Array('data1', 'data2', 'data3' );
var pos = 0;
function continueData(ev) {
  // do whatever checks you need about key
  var ele = document.getElementById("mydata");
  if (pos < dataToLoad.length)
  {
     ele.appendChild(document.createTextNode(dataToLoad[pos]));
     pos++;
  }
}
</script>
<body onkeyup="continueData()"><div id="mydata"></div></body></html>

каждый раз отпущена клавиша, добавляется следующее поле данных

1
ответ дан 13 December 2019 в 22:12
поделиться

Любой хороший браузер выйдет из строя, если встретит сценарий, который выполняется слишком долго. Это сделано для того, чтобы вредоносные веб-сайты не блокировали клиентское приложение.

В javascript не может быть бесконечного цикла. Вместо этого прикрепите прослушиватель событий к окну и укажите, выполняйте ли обработку в обработчике (воспринимайте это как прерывания, а не опрос).

Пример:

function addEventSimple(obj,evt,fn) {
    if (obj.addEventListener)
        obj.addEventListener(evt,fn,false);
    else if (obj.attachEvent)
        obj.attachEvent('on'+evt,fn);
} // method pulled from quirksmode.org for cross-browser compatibility

addEventSimple(window, "keydown", function(e) {
    // check keys
});
0
ответ дан 13 December 2019 в 22:12
поделиться

Проверьте прослушиватель ключей YUI

http://developer.yahoo.com/yui/docs/YAHOO.util.KeyListener.html

с помощью прослушивателя ключей, YUI принимает забота о съемке любых событий. В javascript почти никогда не будет случая, когда вы должны ждать в цикле while, чтобы что-то произошло.

Если вам нужны примеры того, как работает обработка событий, посмотрите эти страницы.

http: // developer. yahoo.com/yui/examples/event/eventsimple.html

0
ответ дан 13 December 2019 в 22:12
поделиться

вы можете прикрепить прослушиватель событий к объекту окна следующим образом

window.captureEvents(Event.KEYPRESS);
window.onkeypress = output;
function output(event) {
  alert("you pressed" + event.which);
}
0
ответ дан 13 December 2019 в 22:12
поделиться
document.onkeydown = function(e) {
  //do what you need to do
}

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

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

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

0
ответ дан 13 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: