Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Node.js > асинхронное выполнение функций


Автор: g27 27.1.2013, 12:32
Здравствуйте, я тут увлёкся node.js на выходных. Решил посмотреть что это такое. Немного застрял на одном моменте. Не понимаю как добавить callback функцию в first, что бы node.js не ждал её.

Код

var http = require('http');
var url = require('url');

var routes = {}
routes["/"] = first;
routes["/first"] = first;
routes["/second"] = second;

function first(response) {
    function sleep(milliSeconds) {
        var startTime = new Date().getTime();
        while (new Date().getTime() < startTime + milliSeconds);
    }
    console.log('First starts'+new Date().getTime());
    sleep(20000);
    console.log('First finished'+new Date().getTime());
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write('first route');
    response.end();
}

function second(response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write('second route');
    response.end();
}


var server = http.createServer(function(request, response) {

    var pathname = url.parse(request.url).pathname;

    if (typeof routes[pathname] === 'function') {
        routes[pathname](response);
    } else {
        response.writeHead(404, {"Content-Type": "text/plain"});
        response.write("404 Not found");
        response.end();
    }
});

server.listen(8000);


Покажите пожалуйста как мне сделать first функцию не блокирующей.

Автор: g27 27.1.2013, 12:51
Хотя может это не возможно и именно это имелось ввиду тут "В node всё работает параллельно, за исключением вашего кода" ?

Автор: g27 27.1.2013, 23:46
Вообщем, я тут читал ещё. Наверное я взял плохой пример. Те задачи, которые могут занять много времени обычно можно выполнить асинхронными функциями node.js, в которые можно передать callback функцию. В результате node.js подвисать не будет. А если писать функцию самому, то изначально необходимо избегать таких блокирующих ситуаций. Вообщем решения моему вопросу нет, так как мой вопрос это изначально не правильное решение задачи средствами node.js. Поправьте если я не прав.

Автор: Shogun 28.1.2013, 18:28
Не совсем понятно чего вы хотите достичь, не знаете как передать колбэк?

Код

function first(arg, callback) {
  setTimeout(function() {
    callback(arg);
  }, 1000);
}

first('arg', function(result) {
  console.log(result); // через секунду вернет 'arg'
});

Автор: g27 29.1.2013, 13:02
нее, дело в том. что во время обработки моего цикла node.js больше ничего не может делать. В том числе и принимать запросы других соединений. Подсказали что для таких задач надо node fibers использовать

Автор: Shogun 29.1.2013, 16:49
Цитата(g27 @  29.1.2013,  12:02 Найти цитируемый пост)
нее, дело в том. что во время обработки моего цикла node.js больше ничего не может делать. В том числе и принимать запросы других соединений. Подсказали что для таких задач надо node fibers использовать 

Ну понятно что while блокирует все, зачем он вам ваще тут нужен? В ноде принято все делать асинхронно. Лучше с начало обдумать код и над тем нужно ли оно вам так чем сразу пихать в node fibers.

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

Автор: СЭНСЭЙ 7.2.2015, 19:30
Может быть вы мне подскажете, что бы я не создавал еще одну тему?

Как на ноде сделать такое:
1 - выбрать данные из базы, из разных таблиц
2 - обработать их
3 - опять выбрать данные из базы
4 - опять обработать
5 - передавать обработанные данные в разные роуты
Если можно пример.
Потому что я не представляю как это сделать асинхронно

П.С. использую express, mongodb, monk

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)