Piszę podstawowy opakowanie do interfejsu API WebKit (nowa wersja To API) dla mnie do użycia. Mój aktualny problem jest funkcją queryUsageAndQuota().

Moja owijarka wokół tej konkretnej funkcji pierwotnie wyglądała:

self.pers.getQuota = function() {
    self.pers.queryUsageAndQuota(function(usage,quota) {
        return quota;
    });
}
// self is a reference to the top level of this 'wrapper'

Dlatego też nazwałbym var quota = self.pers.getQuota(); i miałem kwotę wrócił.

Po tym nie powiodło się, spojrzałem na To pytanie i zmieniło go, więc ja Zamiast tego używał wywołania zwrotnego zdefiniowanego przez użytkownika. Teraz funkcja to:

self.pers.getQuota = function(callback) {
    self.pers.queryUsageAndQuota(function(usage,quota) {
        callback.call(quota);
    });
}

Jednak wykonując tę linię:

self.pers.getQuota(function(quota) {
    console.log(quota);
});

Pokazuje undefined w dzienniku. Nie mogę zrozumieć dlaczego, ponieważ kiedy wykonuję podstawową funkcję navigator.webkitPersistentStorage.queryUsageAndQuota(), otrzymuję odpowiedni numer z niego.

2
ArtOfCode 15 sierpień 2014, 21:48

2 odpowiedzi

Najlepsza odpowiedź

.call nie działa tak, jak myślisz, że tak. Zamiast tego zrobić callback.call(null, quota).

Rzeczywisty podpis zarówno dla Function.prototype.call (i podobnie dla apply) jest

 Function.prototype.call(valueOfThis, valueOfParam1, valueOfParam2, ...);

Dlatego często mówię, że słowo kluczowe this w JavaScript jest głupie i powinieneś unikać używania go. Po prostu jest kolejnym parametrem jak wszystkie inne, po prostu nie należy określić żadnej nazwy. Jest to ślad stworzenia JavaScript, gdy Netscape upoważnił, że język oparty na schemacie wygląda jak java.

Nawiasem mówiąc, można użyć trzeciego sposobu wywołania metod tutaj. Po prostu

callback(quota);

Ma to jednak efekt uboczny, aby jak JavaScript przejmuje się w to, co chcesz this, aby być obiektem globalnym {X1}} w tym przypadku). Dopóki nie używasz this, prosta składnia działa świetnie.

Jeśli faktycznie naprawdę chcesz zwrócić wartość, a nie przekazywać spojrzenie na obiecanie JavaScript. Nie mogę powiedzieć, który z nich używał bez wiedzy, w jakich środowiskach, w których jesteś i jakie biblioteki używasz, ale jQuery ma dobre wdrożenie w obiekcie odroczonym

3
George Mauer 15 sierpień 2014, 17:56

Próbować

self.pers.getQuota = function(callback) {
    self.pers.queryUsageAndQuota(function(usage,quota) {
        callback(quota);
    });
}

lub

self.pers.getQuota = function(callback) {
    self.pers.queryUsageAndQuota(function(usage,quota) {
        callback.call(/* an object as 'this'*/, quota);
    });
}

Funkcja.Prototype.call ()

Lub

self.pers.getQuota = function(callback) {
    self.pers.queryUsageAndQuota(function(usage,quota) {
        callback.apply(/* an object as 'this'*/, [quota]);
    });
}

Funkcja.Prototype.apply ()

1
frogatto 15 sierpień 2014, 17:59