Работает ли что-то подобное в асинхронном коде? - PullRequest
3 голосов
/ 21 мая 2011
regular = 'a string';
enriched = enrichString(regular);
sys.puts(enriched);

function enrichString(str){
    //run str through some regex stuff or other string manipulations
    return str;
}

Сейчас кажется, что он делает то, на что надеялся, но я не знаю, безопасно ли это. Может ли это привести к неопределенности иногда? Нужно ли делать что-то вроде:

regular = 'a string';
enriched = enrichString(regular, function(data){sys.puts(data);});

function enrichString(str, cb){
    //run str through some regex stuff or other string manipulations
    cb(str);
}

Спасибо за помощь!

Ответы [ 3 ]

3 голосов
/ 21 мая 2011

Нет, с тобой все должно быть в порядке.Прямые прогоны вычислительного кода по своей природе не являются асинхронными.Обратные вызовы необходимы, когда есть какое-то действие с участием внешних ресурсов - файловый ввод / вывод, сетевые операции, некоторые взаимодействия с операционной системой и т. Д.

2 голосов
/ 21 мая 2011

Обратные вызовы нужны только при асинхронных неблокирующих вызовах.

var string = "foo",
    new_string = enrich(foo);

doStuff(new_string);

Безопасно, если enrich блокирует. Например

function enrich(str) {
    // do regex stuff with str

    // manipulate it

    return str;
}

блокируется, так что это безопасно. Где, как

function enrich(str) {
    // get some data from the database.

    // store the string in a file.

    return str;
}

Использует неблокирующий ввод-вывод и небезопасен. Что вы хотите сделать, это:

function enrich(str, cb) {
    // get some data from the database.

    // store the string in a file.

    return cb(str);
}

var string = "foo",
    new_string = enrich(foo, function (str) {
        doStuff(new_string);
    });

Обратите внимание, что

enriched = enrichString(regular, sys.puts(data));

Не работает, потому что вы передаете возвращаемое значение sys.puts(data) в качестве параметра функции (данные также не определены!)

Вам нужно передать функцию.

0 голосов
/ 22 мая 2011

Просто чтобы добавить ответ Пойнти, люди иногда вызывают асинхронное поведение с помощью process.nextTick (или в браузере setTimeout (fn, 0)) - это заставляет текущий контекст выполнения возвращаться. Пример: https://github.com/caolan/async/blob/master/lib/async.js#L408-410

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