Tôi đang viết một số node.js để tương tác với các cảm biến qua kết nối cổng nối tiếp. Mã để đọc cảm biến không đồng bộ, một cách tự nhiên. Tuy nhiên, trong mã điều khiển của tôi, tôi cần phải đọc cảm biến, làm điều gì đó dựa trên giá trị, đọc lại, làm điều gì đó khác, v.v. Để thực hiện việc này, tôi đang sử dụng mã như sau thử nghiệm khép kín:Sử dụng chức năng máy phát điện next() dưới dạng gọi lại trong node.js
var main = new Main();
main.next();
function* Main()
{
var reading = yield readSensor(this.next.bind(this));
console.log(reading);
var reading = yield readSensor(this.next.bind(this));
console.log(reading);
}
function readSensor(callback)
{
// simulate asynchrounous callback from reading sensor
setTimeout(function sensorCallback() { callback('foo'); }, 100);
}
Vì vậy, mã kiểm soát tuần tự của tôi nằm trong máy phát có năng suất là readSensor()
khi cần đọc. Khi đọc cảm biến được thực hiện, nó gọi lại cuộc gọi lại và kiểm soát trở lại mã chính. Tôi đang làm nó theo cách này bởi vì tôi có thể cần phải đọc từ các cảm biến khác nhau trong các đơn đặt hàng khác nhau tùy thuộc vào các bài đọc trước đó. Vì vậy, đây là phần đáng ngờ: Tôi vượt qua this.next.bind(this)
dưới dạng gọi lại đến chức năng đọc không đồng bộ. Mã này dường như hoạt động khi máy phát điện được kích hoạt (--harmony_generators
), nhưng tôi tự hỏi nếu có những cạm bẫy ở đây mà tôi đang thiếu. Tôi khá mới đối với JS, vì vậy đừng ngại chỉ ra điều hiển nhiên :)
Tôi không nghĩ rằng bạn có thể gọi một máy phát điện ES6 như một nhà xây dựng. Có lẽ đó là lỗi v8? Hãy để tôi kiểm tra điều này. – Bergi
@Bergi Tôi đã xem thông số dự thảo ES6 mới nhất, nhưng không thể quyết định xem điều này có được hỗ trợ hay không. Tôi nghĩ nó nên như vậy; nó sẽ là một cách nhẹ, tương đối rõ ràng để đối phó với vấn đề gọi lại lồng nhau. Tất nhiên, ngay cả khi bạn không thể xây dựng các máy phát như các đối tượng để chúng có một 'điều này', bạn có thể gửi cho chúng" bản ngã "của chúng với một lệnh' main.next (main); ' '. Nhưng, hiện tại, thư viện Q.async dường như làm những gì tôi theo sau. – tyapo
Tôi đã nghiên cứu bản thảo ES6 chi tiết ngay bây giờ và có thể xác nhận sự nghi ngờ của tôi. Xem câu trả lời của tôi :-) – Bergi