2017-10-29 17 views
5

Próbuję zmodyfikować kod homebridge-wink3, aby dodać zmienną, dzięki czemu mogę śledzić stan. Mam 5 odcieni w moim domu, więc każda instancja zmiennej musi być unikalna.Wyeksportowanie Javascript - Utwórz instancję zmiennych/obiektów

W pliku shade.js ma;

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, 

Chciałbym zmienić get (i set gdzie indziej w kodzie), więc używa zmiennej lokalnej lastState śledzić stan.

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; 

spędziłem godziny próbuje dowiedzieć się, jak mieć kod utrzymania poszczególnych zmiennych za cieniu (instancja obiektu), ale oni zawsze wydają się być z tą samą instancję zmiennej lastState.

Co muszę tu zrobić?

Wyświetl kod w kodzie https://github.com/sibartlett/homebridge-wink3/blob/master/src/devices/shade.js.

+0

Gdzie zdefiniowałeś zmienną lastState? –

+0

@ JorgeFuentesGonzález Nigdzie jeszcze. O to pytam. Gdzie i jak ją zadeklarować? Kod jest zapisany w ES7, a oryginalny "exports.default" wydaje się zwracać szereg parametrów (typ, grupa, usługi []). Potrzebuję, aby parametr/funkcja 'get' miał dostęp do zmiennej lokalnej (w moim przykładzie;' lastState'), którą można ustawić za pomocą parametru/funkcji 'set'. – mriksman

+1

Nie jestem użytkownikiem 'homebridge-wink3', ale zrobię co w mojej mocy, aby pomóc. Problem polega na tym, że nie wiem, co próbowałem do tej pory i nie chcę tracić czasu na próbowanie tego samego, co próbowaliście przez wiele godzin. Moje myślenie o tym jest zwykle tym, co myślą inni użytkownicy StackOverflow, więc co próbowaliście do tej pory? –

Odpowiedz

1

Ważne: Co rozumiem z pytaniem jest to, że chcesz sklonować obiekt (lastState lub przedmiot z metodą get i set).

Załóżmy Mam Object tak:

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

Teraz załóżmy, że chcę, aby sklonować obiektu A do obiektu 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); 

To jest przykładowy przykład:

 
 
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);

Następnie możesz sklonować/skopiować cały obiekt, aby mieć pewne charakterystyczne właściwości w swoich obiektach lub sklonować kod lastState. Nie rozumiem tej części twojego pytania, przepraszam.

Uwaga:to pytanie próbuje odpowiedzieć na pytanie. Jeśli nie rozumiem tego pytania, proszę o komentarz.

zauważyć również:Jeśli nie odpowie na pytanie, twój mogą swobodnie korzystać z Poste powyższy kod i skopiować mój post w celu udzielenia odpowiedzi na pytanie.

Uwaga:Jeśli masz pytanie, powiedz komentarz.

+0

Nie chcę klonować. Problemem jest użycie 'exports.default' (chyba). Twój kod wygląda jak "commonJS" (??), który może nie być bezpośrednio powiązany z tym kodem "ES7". Najlepszą rzeczą do zrobienia, aby odpowiedzieć na pytanie, jest otwarcie linku podanego w moim pytaniu. Powinieneś być w stanie ustalić, co wywołuje ten plik 'shade.js', jak tworzony jest obiekt/moduł/urządzenie, a następnie jak śledzić stan w zmiennej lokalnej (' lastState') dla każdego z tych utworzonych obiektów. – mriksman

+0

Funkcja "exports.default" oznacza, że ​​jest funkcją. Funkcja (pokazana w moim pytaniu) jest po prostu funkcją 'return', która zwraca listę parametrów. W ES6 iw tej funkcji, w jaki sposób mogę dodać zmienną, która będzie trwała przez cały czas życia obiektu/modułu/urządzenia? – mriksman

+0

@mriksman, Co masz na myśli przez utrzymywanie życia obiektu? –

1

Można zadeklarować lastState tuż powyżej instrukcji return,

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

lub powyżej rachunku eksportowej

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

jeśli deklarują lastState w takim samym zakresie jak gdzie utworzeniu 5 wystąpień wtedy wszyscy będą dzielić ten sam lastState.

+0

Pierwsza z nich bardzo zależy od tego, jak działa 'homebridge-wink3'. Może jednorazowo uruchamia eksport, a następnie buforuje powrót, cały czas dzieląc ten sam zakres. Drugi będzie na pewno mieć ten sam zasięg, ponieważ kod jest uruchamiany tylko raz w pliku node.js, a następnie eksport jest buforowany, więc to, co znajduje się poza eksportem, ma taki sam zakres dla wszystkich elementów eksportu. –

+0

Jestem pewien, że szybkie spojrzenie na kod na github od kogoś, kto rozumie "zakresy", a ES6 i ES7 i ... będą w stanie szybko określić problem. Mój zestaw umiejętności po prostu nie jest w stanie poradzić sobie z tym eksportem i zasięgiem. Byłem ledwie zdolny do wspólnego JS, ale to dla mnie wszystko nowe ... – mriksman

+0

Czy próbowałeś sugerowanej odpowiedzi? – Pratheep

Powiązane problemy