2017-10-29 53 views
5

Tôi đang cố sửa đổi mã homebridge-wink3 để thêm biến để tôi có thể theo dõi trạng thái. Tôi có 5 sắc thái trong nhà, vì vậy mỗi phiên bản của biến cần phải là duy nhất.Xuất Javascript - Khởi tạo Biến/Đối tượng

Trong tệp shade.js, tệp này có;

exports.default = ({ Characteristic, Service }) => { 
    return { 
    type: "shade", 
    group: "shades", 
    services: [{ 
     service: Service.WindowCovering, 
     characteristics: [{ 
     characteristic: Characteristic.TargetPosition, 
     get: (state, desired_state) => desired_state.position * 100, 

Tôi muốn thay đổi get (và set ở đâu đó trong code) để nó sử dụng một biến địa phương lastState để theo dõi trạng thái.

get: (state, desired_state) => { 
       if (desired_state.position != null) { 
         lastState = desired_state.position * 100; 
       } 
       else if (lastState != undefined) { 
         desired_state.position = lastState/100; 
       } 
       return lastState; 

Tôi đã dành giờ cố gắng để làm việc ra làm thế nào để có mã duy trì biến cá nhân mỗi bóng râm (object chẳng hạn), nhưng họ dường như luôn được chia sẻ cùng một ví dụ của biến lastState.

Tôi cần làm gì ở đây?

Xem https://github.com/sibartlett/homebridge-wink3/blob/master/src/devices/shade.js cho mã.

+0

Bạn đã xác định biến lastState ở đâu? –

+0

@ JorgeFuentesGonzález Hư không. Đó là câu hỏi của tôi. Tôi khai báo ở đâu và như thế nào? Mã được viết bằng ES7 và bản gốc 'exports.default' xuất hiện để trả lại một loạt các tham số (loại, nhóm, dịch vụ []). Tôi cần phải có tham số 'get'/function có quyền truy cập vào một biến cục bộ (trong ví dụ của tôi;' lastState') có thể được thiết lập bởi tham số/hàm 'set'. – mriksman

+1

Tôi không phải là người dùng 'homebridge-wink3', nhưng tôi sẽ cố hết sức để giúp đỡ. Vấn đề là tôi không biết những gì bạn đã thử cho đến nay và tôi không muốn lãng phí thời gian cố gắng để làm điều tương tự bạn đã cố gắng trong nhiều giờ. Suy nghĩ của tôi về điều này thường là những gì phần còn lại của các thành viên StackOverflow nghĩ, vì vậy, những gì bạn đã cố gắng cho đến nay? –

Trả lời

1

Chú ý: Những gì tôi hiểu câu hỏi của bạn là bạn muốn sao chép một đối tượng (lastState hoặc đối tượng với getset phương pháp).

Giả sử tôi có một đối tượng A như thế này:

var A = { 
     aVariable: "Panem et circencem", 
     aMethod: function() { 
     return (["Veni", "vidi", "vici"]); 
     } 
    }; 

Bây giờ, giả sử rằng tôi muốn sao chép các đối tượng A đến một đối tượng B.

function clone(obj) { 
    if (null == obj || "object" != typeof obj) return obj; 
    var copy = obj.constructor(); 
    for (var attr in obj) { 
    if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; 
    } 
    return copy; 
} 

var B = clone(A); 

Đây là một ví dụ mẫu:

 
 
var A = { 
 
    aVariable: "Panem et circencem", 
 
    aMethod: function() { 
 
    return (["Veni", "vidi", "vici"]); 
 
    } 
 
}; 
 
function clone(obj) { 
 
    if (null == obj || "object" != typeof obj) return obj; 
 
    var copy = obj.constructor(); 
 
    for (var attr in obj) { 
 
    if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; 
 
    } 
 
    return copy; 
 
} 
 

 
var B = clone(A); 
 
B.aVariable = "Ad gloriam"; 
 
console.log(B); 
 
console.log (A);

Sau đó, bạn có thể sao chép/sao chép tất cả đối tượng của mình để có một số thuộc tính riêng biệt trong đối tượng của bạn hoặc sao chép mã lastState trong mã của bạn. Tôi không hiểu phần này của câu hỏi của bạn, xin lỗi.

Lưu ý:câu hỏi này cố gắng trả lời câu hỏi. Nếu tôi không hiểu câu hỏi, xin vui lòng cho tôi biết một bình luận.

Cũng cần chú ý:Nếu tôi không trả lời câu hỏi, bạn có thể tự do sử dụng poste mã trên và sao chép bài của tôi để trả lời câu hỏi.

Tương tự, lưu ý:Nếu bạn có câu hỏi, hãy cho tôi biết nhận xét.

+0

Tôi không muốn sao chép. Vấn đề là việc sử dụng 'exports.default' (tôi nghĩ). Mã của bạn trông giống như 'commonJS' (??) có thể không liên quan trực tiếp đến mã' ES7' này. Điều tốt nhất để làm, để trả lời câu hỏi, là mở liên kết tôi đã liệt kê trong câu hỏi của tôi. Bạn có thể tìm ra cái gọi là tệp 'shade.js' này, cách đối tượng/mô-đun/thiết bị được khởi tạo và cách tôi theo dõi trạng thái trong một biến cục bộ (' lastState') cho từng đối tượng được khởi tạo này. – mriksman

+0

'exports.default' có nghĩa là nó là một hàm. Hàm (được hiển thị trong câu hỏi của tôi) chỉ đơn giản là hàm 'return' trả về một danh sách các tham số. Trong ES6, và trong hàm này, làm thế nào tôi có thể thêm một biến sẽ tồn tại trong suốt cuộc đời của đối tượng/mô-đun/thiết bị? – mriksman

+0

@mriksman, Bạn có ý gì khi kiên trì trong cuộc đời của vật thể? –

1

Bạn có thể tuyên bố lastState ngay trên báo cáo kết quả lợi nhuận,

let lastState; 
return { 
    type: "shade", 
    group: "shades", 

trở lên báo cáo kết quả xuất khẩu,

let lastState; 
export default ({ Characteristic, Service }) => { 

nếu bạn khai báo lastState trong phạm vi tương tự như nơi bạn tạo ra 5 trường hợp sau đó tất cả họ sẽ chia sẻ cùng một lastState.

+0

Điều đầu tiên phụ thuộc rất nhiều vào cách hoạt động của 'homebridge-wink3'. Có thể nó chạy một lần xuất và sau đó nhớ cache trả về, chia sẻ cùng một phạm vi mọi lúc. Ngoài ra, thứ hai sẽ chia sẻ cùng một phạm vi cho chắc chắn, vì mã được chạy chỉ 1 lần trong node.js, và sau đó xuất được lưu trữ, vì vậy những gì nằm ngoài xuất khẩu là cùng phạm vi cho mọi thứ bên trong xuất. –

+0

Tôi chắc chắn xem nhanh mã trên github từ một người hiểu 'phạm vi' và ES6 và ES7 và ... sẽ có thể nhanh chóng xác định vấn đề. Bộ kỹ năng của tôi đơn giản là không bắt đầu với công cụ xuất và phạm vi này. Tôi hầu như không có khả năng với commonJS, nhưng điều này hoàn toàn mới đối với tôi ... – mriksman

+0

Bạn đã thử câu trả lời được đề xuất chưa? – Pratheep

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