MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Асинхронен, обратни извиквания, затваряне, о, Господи

Ако го разбирам правилно, ще искате да направите нещо подобно:

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

Това означава, че ще искате да напишете "getPositions" по начин, който приема един параметър за обратно извикване, който се извиква, след като позициите са заредени успешно, и му се предава масивът от позиции. В getPositions можете да проверите дали позициите вече са заредени и ако е така, директно да извикате обратното извикване. В противен случай ще ги добавите към опашка от обратни извиквания (напр. this.positionsLoadedCallbacks ), през който итерирате, след като всички позиции са заредени (мисля, че това ще бъде някъде във вашето load функция близо до me.orderPositions() ).

Например вашите getPositions функция може да изглежда така:

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

    this.positionsLoadedCallbacks.push(callback);
},

Някъде след като сте сигурни, че позициите са заредени (т.е. в обратното извикване за успех на loadJSON), ще трябва да поставите нещо подобно:

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

И не забравяйте да инициализирате this.positionsLoadedCallbacks :)

любопитни факти за console.log

Причината, поради която console.log(positions) работи и console.log(positions[0]) не е лесно:ако подадете препратка към обект към console.log , обектът ще бъде проверен, когато щракнете върху малката стрелка за "разгъване" и се опитате да погледнете отвътре обектът/масивът. Докато щракнете върху тази стрелка, позициите са заредени, разбира се. Въпреки това, ако подадете конкретен елемент от масив (напр. positions[0] ) той директно ще се опита да потърси тази стойност и ще открие, че тя все още е undefined и запишете този резултат в конзолата.

Опитайте сами:

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

Предишният фрагмент, в chrome 24, показва [Array[0]] в конзолата, но когато го разширя, ми казва, че масивът като length: 1 и че първият му елемент е 123




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Използвайте LINQ в C#, за да намерите MondoDB записи, когато стойностите в поле от списък съответстват на стойност на критерии от списък

  2. mongodb не стартира на ubuntu 18.04

  3. Конфигуриране на oauth2-server-laravel с laravel-mongodb

  4. Инсталирайте phpMongo драйвери на windows

  5. Как мога да реша MongoWaitQueueFullException?