2015-09-21 14 views
12

Tôi có ví dụ sauthế nào để tiêu diệt một dòng suối vùng cao

const input = _(); 
const output = _() 
    .each(x => console.log('out', x)); 

input 
    .pipe(output); 

input.write(1) 
output.destroy(); 
input.write(2); 

Theo như tôi có thể đọc trong tài liệu (http://highlandjs.org/#destroy) phá hủy dòng nên dọn dẹp đường ống bị hỏng. Thay vì tôi nhận được lỗi sau:

out 1 
out 2 
node_modules/highland/lib/index.js:1114 
     throw new Error('Can not call next after nil'); 
     ^

Error: Can not call next after nil 

Có ai có một số cái nhìn sâu sắc tại sao điều này happends, và những gì cách chính xác để tiêu diệt các dòng là gì?

Trả lời

4

Từ đọc tài liệu, có vẻ như This là câu trả lời cho lỗi của bạn. Cách thức mà luồng cho phép phần còn lại của chương trình biết rằng nó đã kết thúc bằng cách chuyển "nil" làm phần dữ liệu tiếp theo trên luồng. Nhìn vào mã mẫu tại liên kết đó, bạn có thể xác định rằng luồng đã kết thúc và hành động tương ứng.

Đó là lý do tại sao bạn gặp phải lỗi - đường ống của bạn đang cố gắng tiếp tục với dữ liệu tiếp theo, nhưng đang ném lỗi vì không có thứ gì tiếp theo sau "không". Đối với một cách chính xác để tiêu diệt một dòng, tôi nghĩ rằng cách bạn đang sử dụng là một cách chính xác (tôi không quen với highland.js, do đó, nó chỉ dựa trên đọc tài liệu và làm quen với javascript nói chung), đó chỉ là hiệu ứng không nhất thiết là những gì bạn mong đợi. Tôi sẽ không mong đợi phá hủy đầu ra để phá hủy đường ống, điều này là do đường ống "thuộc" đến đầu vào, vì nó được gọi là chống lại. Nếu bạn muốn phá hủy đường ống của bạn, tôi sẽ tưởng tượng rằng cách để đi về nó sẽ được gọi là

input.destroy() 

thay vì (hoặc thực sự, cũng như output.destroy(), như bạn không muốn để lại kết thúc lỏng lẻo!). Tài liệu nói rằng bạn nên gọi hủy() hoặc .end() trên bất kỳ luồng được tạo thủ công nào (như bạn đã ở trên).

Hãy suy nghĩ về điều đó theo cách này. Nếu tôi có một nguồn là đường ống đến đích, và tôi xóa điểm đến đó, tất nhiên tôi sẽ gặp lỗi, vì đầu vào của tôi không có nơi nào để đi và luồng đầu ra của tôi sẽ nói mọi thứ khác đã kết thúc. Nếu bạn muốn phá hủy các đường ống, nó có ý nghĩa hơn để tiêu diệt các nguồn, và nếu bạn dừng đầu ra/đích, bạn cần phải tìm một nơi khác cho đầu vào của bạn để đi!

+0

Hmmm… được rồi, điều này giải thích mọi thứ. Cảm ơn cho rằng cho đến nay :-). Câu hỏi đặt ra là: Làm thế nào tôi có thể phá hủy đầu ra và giữ luồng đầu vào, vì tôi vẫn cần nó? OTOH tài liệu hướng dẫn rõ ràng rằng 'destroy()' cũng sẽ loại bỏ luồng từ bất kỳ nguồn nào, do đó, điều này có vẻ như bạn có thể bỏ qua cách này cũng như từ luồng nguồn. –

+0

Đây sẽ là thời điểm tốt để tự hỏi mình những gì bạn đang cố gắng đạt được! Một đường ống có thể được chuyển hướng đến một đầu ra mới không? Thành thật mà nói, tôi không thể nói categorically, nhưng câu hỏi là, bạn cần phải? Một khi bạn gọi .destroy() trên đầu ra nó không còn tồn tại, vì vậy bạn cần phải làm một cái gì đó về đường ống của bạn trên đầu vào. Bạn có thể thử xác định đầu ra mới và gọi lại .pipe trên đầu vào cho đầu ra mới đó, xem điều gì xảy ra ở đó. Hoặc bạn có thể xem xét lại việc phá hủy đầu ra ngay từ đầu. Bạn có thể xác định lại những gì nó làm thay thế. Hoặc bạn nên thậm chí bằng cách sử dụng lại đầu vào? chỉ nên kết thúc tất cả và bắt đầu với một bộ mới? –

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