Вопрос о выполнении кода и природе блокировки / неблокирования JavaScript - PullRequest
1 голос
/ 04 ноября 2019

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

func() -> self.db.createEntry() -> res.on() -> callback -> self.submit()

Но у меня были случаи, когда это

func() -> self.db.createEntry() -> callback -> res.on() -> self.submit()

Я не могу контролировать, когда вызывается res.on('data')потому что это слушатель события сокета и обрабатывается на отдельном сервере. Я думаю, что я боюсь, что обратный вызов будет вызван в середине res.on(), это может произойти? Скажем, res.on() находится прямо в середине выполнения, сможет ли обратный вызов прервать это?

const func = function(){

self.db.createEntry(self.arg, self.arg1, function(response){
    if(response){
        self.arg = response
        self.state.wait = false
        if(self.state.wait){
            self.submit()
        }
    }
});

res.on('data', function(data) {
    data = parse(data);
    if(!data.contentId){
        self.state.wait = true;
        self.state.data = data
    }
    else {
        self.submit(data);
    }
});

}

func()

db.prototype.createEntry = function(arg, arg1, callback) {
    self.connect();
    self.connection.query('INSERT INTO table_name SET ?', arg, function(err, results, fields) {
        if(err) {
            self.disconnect();
            callback()
        }
        else {    
            self.disconnect();
            callback(results)
        }
    });
}

1 Ответ

1 голос
/ 04 ноября 2019

Единственный способ для кода JavaScript переключиться на полпути в функции из-за инструкции yield.

Ваша текущая функция не включает в себя такие.

yield также редко используется. Вместо этого мы используем обратные вызовы (код async / await - это обратные вызовы для стероидов - синтаксический сахар, упрощающий написание кода без тонны встроенных функций, используемых для обработки длинной цепочки обратных вызовов, и гораздо более простой способ обработки ошибок тоже. ).

self.submit() сгенерирует такой обратный вызов, но сам res.on() не собирается останавливаться на полпути .

Имейте в виду, что JavaScript по-прежнемууправляемый событиями, и он не использует несколько потоков. Таким образом, одновременно выполняется только одна функция.

Если порядок (callback -> res.on() или res.on() -> callback) не имеет значения, тогда все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...