Подтвердить что ты не робот

Node.js асинхронная синхронизация

Как я могу сделать эту работу

var asyncToSync = syncFunc();

function syncFunc() {
    var sync = true;
    var data = null;
    query(params, function(result){
        data = result;
        sync = false;
    });
    while(sync) {}
    return data;
}

Я попытался получить функцию синхронизации от async one, Мне нужно, чтобы использовать async-запрос FreeTds как синхронизирующий

4b9b3361

Ответ 1

Используйте deasync - модуль, написанный на С++, который предоставляет JavaScript-конвейер Node.js. Модуль также предоставляет функцию sleep, которая блокирует последующий код, но не блокирует весь поток и не оживляет ожидание. Вы можете поместить функцию sleep в цикл while:

var asyncToSync = syncFunc();

function syncFunc() {
    var sync = true;
    var data = null;
    query(params, function(result){
        data = result;
        sync = false;
    });
    while(sync) {require('deasync').sleep(100);}
    return data;
}

Ответ 2

Вы можете сделать это с помощью node -sync lib

var sync = require('sync');

sync(function(){
  var result = query.sync(query, params);
  // result can be used immediately
})

Обратите внимание: ваш запрос должен использовать стандартный вызов обратного вызова (с первой ошибкой): обратный вызов (ошибка, результат). Если вы не можете изменить метод запроса, просто создайте оболочку .async() (см. Ссылку github).

Ответ 3

В настоящее время этот шаблон генератора может быть фантастическим решением во многих ситуациях:

// nodejs script doing sequential prompts using async readline.question function

var main = (function* () {

  // just import and initialize 'readline' in nodejs
  var r = require('readline')
  var rl = r.createInterface({input: process.stdin, output: process.stdout })

  // magic here, the callback is the iterator.next
  var answerA = yield rl.question('do you want this? ', res=>main.next(res))    

  // and again, in a sync fashion
  var answerB = yield rl.question('are you sure? ', res=>main.next(res))        

  // readline boilerplate
  rl.close()

  console.log(answerA, answerB)

})()    // <-- executed: iterator created from generator
main.next()     // kick off the iterator, 
                // runs until the first 'yield', including rightmost code
                // and waits until another main.next() happens

Ответ 4

Я с большим успехом использовал syncrhonize.js. Там даже ожидающий запрос на подачу (который работает достаточно хорошо) для поддержки асинхронных функций, которые имеют несколько параметров. Гораздо лучше и проще в использовании, чем node -sync imho. Добавлен бонус, что у него есть простая в понимании и тщательная документация, тогда как node -sync нет.

Ответ 5

Проблема, с которой вы сталкиваетесь, заключается в том, что ваш жесткий цикл while блокируется. Поэтому я не думаю, что ваш обратный вызов будет когда-либо запущен. Я думаю, вам нужно использовать setTimeout или тому подобное, чтобы предотвратить блокировку функции, но если вы это сделаете, функция вернется до вызова callback. Эта функциональность должна быть реализована на более низком уровне.

Если вы находитесь в браузере, вы можете проверить эту статью. В node вам нужно полагаться на реализацию того, что вы запрашиваете. Он может или не может предоставлять синхронные методы.