2016-04-16 65 views
12

düşünün:Node.js: Eşzamansız işlevleri akımların içinden kullanabilir misiniz?

var asyncFunction = function(data, callback) { 
    doAsyncyThing(function(data){ 
    // do some stuff 
    return callback(err) 
    }) 
} 
fs.createReadStream('eupmc_lite_metadata_2016_04_15.json') 
    .pipe(JSONstream.parse()) 
    .on('data', asyncFunction) // <- how to let asyncFunction complete before continuing 

asyncFunction tamamlandığında nasıl akışı biliyor? Eşzamanlı işlevleri akımların içinden kullanmanın bir yolu var mı?

+0

: Eğer bir şey gibi yapabileceği, basit bir örnek olarak https://nodejs.org/api/stream.html#stream_transform_transform_chunk_encoding_callback

: İşte belgeler şunlardır ('veri', işlev). Yine de güzel bir şey yapmak istiyorsanız, akışı duraklatabilir, eşyalarınızı yapabilir ve akışı devam ettirebilirsiniz. –

+0

@DaveBriand, bunu yapamayacağınızı kategorik olarak mı söylüyorsunuz yoksa soruyu yeniden mı söylüyorsunuz? :) – Fergie

+0

Kategorik olarak, veri akışı olayına iki bağımsız değişken işlevi iletemezsiniz. Bununla birlikte, veri olayındaki akışı duraklatabilir, bazı zaman uyumsuz işlemleri yapabilir, ardından işleminiz tamamlandığında akışı devam ettirebilirsiniz. –

cevap

8

Dönüştürme akışlarını gözden geçirin. Size, bir öbek üzerinde uyumsuz kod çalıştırma yeteneğini verir ve işiniz bittiğinde bir geri arama çağrısı yapın. Ben dokümantasyon üzerinde iki parametre göstermiyor çünkü akışı geri arama nasıl işleyeceğini emin değilim

const Transform = require('stream').Transform 
class WorkerThing extends Transform { 
    _transform(chunk, encoding, cb) { 
     asyncFunction(chunk, cb) 
    } 
} 

const workerThing = new WorkerThing() 

fs.createReadStream('eupmc_lite_metadata_2016_04_15.json') 
.pipe(JSONstream.parse()) 
.pipe(workerThing) 
+1

İlk başta ne söylediğini anlamadım, ama evet, dönüşüm akımlarının muhtemelen ileriye giden yol olduğunu görüyorum. Bunu deneyeceğim. – Fergie

+1

Evet, bu işe yarıyor. – Fergie