2016-04-16 12 views
12

xem xét như sau:Node.js: bạn có thể sử dụng các chức năng không đồng bộ từ bên trong luồng không?

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 

Làm thế nào để biết khi nào dòng asyncFunction đã hoàn thành? Có cách nào để sử dụng các chức năng không đồng bộ từ bên trong luồng không?

+0

Tôi không chắc chắn cách dòng sẽ xử lý gọi lại kể từ khi tài liệu không hiển thị hai thông số ở trên ('dữ liệu', chức năng). Nếu bạn muốn làm điều gì đó lạ mắt, bạn có thể tạm dừng luồng, làm công cụ của bạn, sau đó tiếp tục luồng. –

+0

@DaveBriand bạn đang nói categorically rằng bạn không thể làm điều này, hoặc là bạn nghỉ ngơi câu hỏi? :) – Fergie

+0

Categorically bạn không thể chuyển một hàm hai đối số cho sự kiện luồng dữ liệu. Tuy nhiên, bạn có thể tạm dừng luồng trên sự kiện dữ liệu, thực hiện một số xử lý không đồng bộ, sau đó tiếp tục luồng khi quá trình xử lý của bạn hoàn tất. –

Trả lời

8

Kiểm tra luồng biến đổi. Họ cung cấp cho bạn khả năng chạy mã async trên một đoạn, và sau đó gọi một cuộc gọi lại khi bạn đã hoàn tất. Dưới đây là các tài liệu: https://nodejs.org/api/stream.html#stream_transform_transform_chunk_encoding_callback

Là một ví dụ đơn giản, bạn có thể làm điều gì đó như:

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

Tôi đã không thực sự hiểu những gì bạn đã nói lúc đầu, nhưng có, tôi thấy bây giờ mà biến đổi dòng có lẽ là con đường phía trước. Sẽ thử điều này. – Fergie

+1

Có, tính năng này hoạt động. – Fergie

Các vấn đề liên quan