LINUX.ORG.RU

js получить данные из callback

 , , ,


0

1

Вот есть допустим такое.

var text = '';

fs.read('./file.txt','utf8',function(err,data){
    //как мне data отдать в text?
});

function foo(text){
    //что то делаем с text
};

Вот так я не хочу

function foo(text){
   //bla bla 
};

fs.read('./file.txt','utf8',function(err,data){
     foo(data);
     
});

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

Вот так я не хочу

Придется.

Из вариантов: прочитать файл синхронно (о последствия понятно), либо упростить себе жизнь, используя библиотеку async или EventEmitter.

Black_Roland ★★★★
()
var holder = { text: ''};

fs.read('./file.txt','utf8',function(err,data){
    //как мне data отдать в text?
    holder.text=data;
});

function foo(text){
    //что то делаем с text
};
anonymous
()
Ответ на: комментарий от Dron

Не хочешь подцеплять - страдай лапшой.

zz ★★★★
()
Ответ на: комментарий от zz

ааа, хотим синхронности в мире асинхронности

это хорошо, это правильно

anonymous
()

так я не хочу

А так делать надо, иначе разве что с помощью Promises или async. Если как-нибудь иначе у тебя заработает, то это будет ненадёжно и неправильно.

Ну и в ES6 появятся нативные промисы и генераторы, но настоящее сахарное счастье наступит с повсеместным появлением ES7, который принесёт с собой async/await.

P.S.: рекомендую взглянуть на промисы, всё-таки в ES6 они уже будут стандартом. Эффективную и совместимую реализацию предоставляет модуль bluebird.

Y ★★
()
Ответ на: комментарий от Black_Roland

прочитать файл синхронно

Я ступил в квадрате, всё равно пока не будет получено содержимое файла полезной работы не будет делаться. Так что тут fs.readFileSync(); и нужен был (я забыл про него)

А разве async позволит вернуть данные из callback?

Dron ★★★★★
() автор топика
Ответ на: комментарий от Dron

всё равно пока не будет получено содержимое файла полезной работы не будет делаться

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

nuboquest
()
Ответ на: комментарий от Dron

А разве async позволит вернуть данные из callback?

Да.

Пиши так:

      async.waterfall([
        function(cb) {

          fs.read('./file.txt', 'utf8', cb);

        },
        function(text, cb) {

          // это foo
          cb(null, 'можно передать еще', 'какие-нибудь данные'); // вызвать в конце

        }
      ], function(err, str1, str2) {

        // проверить на ошибки
        // остальные аргументы принимают значения, переданные в коллбэке выше

      });

Black_Roland ★★★★
()
Последнее исправление: Black_Roland (всего исправлений: 1)
Ответ на: комментарий от nuboquest

Не, в моём случае это просто утилитка для предварительной обфускации js кода. Да и файл читается единожды, так что и для обфускации на лету подойдёт. Если данные не изменяемые лучше один раз прочитать при старте и закэшировать в переменную. IMНO

Dron ★★★★★
() автор топика
Ответ на: комментарий от Black_Roland

Ох ё, спасибо ещё раз, мозг пока с трудом парсит подобное.

Dron ★★★★★
() автор топика
Ответ на: комментарий от Vit

Ну блин, чудес не бывает

Ну блин я только вникаю в js в node, так что была мысль - «А вдруг» ::)

Вот же есть...

Да, это и использовал.

Dron ★★★★★
() автор топика
Ответ на: комментарий от Dron

Да, это и использовал.

Ну и правильно. Если нода 0.12, то там уже добавили синхронные интерфейсы для spawn/zlib, и теперь вполне реально присать полностью синхронные скрипты.

Vit ★★★★★
()
Ответ на: комментарий от tensai_cirno

Колбеки это гарантированный ад.

Только если скилла не хватает.

slyjoeh ★★★
()
Ответ на: комментарий от tensai_cirno

Просто порог вхождения выше - надо уметь программировать :)

Vit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.