2015-02-16 4 views
0

Я пытаюсь поймать завершение записи потока холст таким образом:Node.js stream.on («конец» ... не делает файл читаемым

var out = fs.createWriteStream(out_fs); 
    var stream = canvas.createPNGStream({ 
     bufsize: 2048 
    }); 
    stream.on('end', function() { 
     // can we use out_fs now? why not? 
    }); 
    stream.pipe(out); 

Но когда я пытаюсь загрузить out_fs в суб функция

Error: Image given has not completed loading

на этой линии:

  fs.readFile(out_fs, function (err, data) { 
        if (err) throw err; 
        var img = new Canvas.Image; // Create a new Image 
        img.src = data; 
        ctx2.drawImage(img, 0, 50, img.width, img.height); <-- 

http://nodejs.org/api/stream.html#stream_event_end

Но я не вижу другого способа продолжить управление потоком после того, как будет записан поток. Если я верну всю родительскую функцию, тогда файл будет считаться читаемым. Я пробовал обернуть свои дочерние функции в setImmediate(), но это, похоже, работает с перерывами.

Каков окончательный способ уловить конечный конечный результат записи потока?

документация узла холст утверждает, что end события сигнализирует окончательную запись файла: https://www.npmjs.com/package/canvas#canvaspngstream

Но это порождает ошибку выше, если вы сразу же попытаться использовать его.

`finish ', похоже, не реализован вообще.

+0

Вы бы подумали, что это сработает, но его вообще не называют. – metalaureate

+1

'.on ('end')' должно быть достаточно, я думаю, вы должны разместить больше кода, так как может возникнуть проблема с потоком управления (что-то работает, прежде чем вы подумаете и т. Д.). – aarosil

+0

@aarosil ok Я не горжусь пирамидой гибели - вы, вероятно, правы. Но по существу я генерирую один объект canvas, а затем создаю второй объект canvas, который представляет собой монтаж первых + двух внешних файлов img. http://pastebin.com/E0J1QTvr – metalaureate

ответ

1

Поскольку вы конвейеру stream до out, out будет close() 'd автоматически на streamend событие (это часть того, что автоматически устанавливается при .pipe() потоке). Итак, чтобы знать, когда файл закончен, записывается событие close потока out.

Вы видели прерывистые результаты, потому что событие streamend - это то же самое событие, которое будет использоваться out записываемым потоком для завершения файла.

1

Я бы поставил это в комментарии (но не может):

Вы должны закрыть WriteStream под названием «из» - использовать aarosil событие предлагает и сделать out.close()

+0

Это может быть правильно - это не решает проблему, хотя это объект 'stream', который генерирует ошибку. Я уточнил вопрос более подробно. – metalaureate

+0

Я думаю, что у aarosil есть это с комментарием ниже – diversemix

Смежные вопросы