MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Async, wywołania zwrotne, zamknięcie, ojej

Jeśli dobrze rozumiem, będziesz chciał zrobić coś takiego:

var positions = this.getPositions(function(positions) {
    console.log(positions[0]);
});

Oznacza to, że będziesz chciał napisać "getPositions" w taki sposób, aby akceptował pojedynczy parametr wywołania zwrotnego, który jest wywoływany po pomyślnym załadowaniu pozycji i jest przekazywany do tablicy positions. W getPositions możesz sprawdzić, czy pozycje zostały już załadowane, a jeśli tak, bezpośrednio wywołać callback. W przeciwnym razie dodasz je do kolejki wywołań zwrotnych (np. this.positionsLoadedCallbacks ), przez które wykonujesz iterację po załadowaniu wszystkich pozycji (myślę, że byłoby to gdzieś w twoim load funkcja w pobliżu me.orderPositions() ).

Na przykład Twoje getPositions funkcja może wyglądać tak:

getPositions : function(callback) {
    if(this.positions !== null) {
        callback(this.positions);
        return;
    } 

    this.positionsLoadedCallbacks.push(callback);
},

Gdzieś po upewnieniu się, że pozycje zostały załadowane (tj. w wywołaniu zwrotnym sukcesu loadJSON), musisz umieścić coś takiego:

for(var i=0; i < this.positionsLoadedCallbacks.length; i++) {
    this.positionsLoadedCallbacks[i](this.positions);
}

I nie zapomnij zainicjować this.positionsLoadedCallbacks :)

ciekawostki dotyczące konsoli.log

Powód, dla którego console.log(positions) działa i console.log(positions[0]) nie jest łatwe:jeśli przekażesz referencję do obiektu do console.log , obiekt zostanie sprawdzony, gdy klikniesz małą strzałkę „rozwiń” i spróbujesz zajrzeć do środka obiekt/tablica. Oczywiście do czasu kliknięcia tej strzałki pozycje zostaną załadowane. Jeśli jednak przekażesz określony element tablicy (np. positions[0] ) spróbuje bezpośrednio wyszukać tę wartość i stwierdzi, że nadal jest undefined i zapisz wynik w konsoli.

Wypróbuj sam:

var i = [];
console.log([i]);
i.push(123);

Poprzedni fragment, w chrome 24, pokazuje [Array[0]] w konsoli, ale kiedy ją rozwinę, mówi mi, że tablica ma length: 1 i że jego pierwszym elementem jest 123




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak grupować dokumenty z określonym polem w agregacji mongodb

  2. Zapisz tablice w schemacie Mongoose

  3. MongoDB wstawia dokument lub pole inkrementacji, jeśli istnieje w tablicy

  4. Wysyłanie JSON do Flask powoduje błąd 400 Bad Request

  5. Jak zamienić podciąg w dokumencie mongodb