2016-07-15 17 views
0

Ich versuche, eine lokale PouchDB mit Ergebnissen von einer Website zu laden. Sobald die Ergebnisse lokal geladen sind, möchte ich sie nicht noch einmal herunterladen.pouchDB Abfrage allDocs ursprüngliche Abfrage

Um dies zu vermeiden, erhalte ich eine Liste der vorhandenen Dateien und teste dann, ob ich sie in der Vergangenheit geladen habe, bevor ich sie geholt habe.

function DownloadFile($fname){ 
     $query = { 
      include_docs: false, 
      attachments: false, 
      startkey: ['run',$fname].join(','), 
      endkey: ['run',$fname,'\uffff'].join(',') 
     }; 
     db.allDocs($query).then(function (result) { 
      if (result.rows.length !== 0) return; 
      $url = './runDb/' + $fname + '/results.xml'; 
      $.ajax({ 
       url: $url, 
       type: "GET", 
       dataType: "xml", 
       contentType: "text/xml", 
       async: true, 
       success: function (results,status,xhr) { 
        app.ParseResults($fname,results) 
       } 
      }); 
     }).catch(function (err) { 
      console.log(err); 
     }); 
} 

Das Problem, das ich habe, ist, dass durch die Zeit DownloadFile get des gerufenen 100-mal und die allDocs Abfrage endlich etwas zurückgibt, ich weiß nicht mehr, was die ursprüngliche Abfrage, die keine Ergebnisse zurückgegeben.

Gibt es in PouchDb eine Möglichkeit, die Abfrageparameter zu bestimmen, die zum Erstellen einer bestimmten Ergebnismenge verwendet wurden?

EDIT: Während ich die angenommene Antwort wirklich mag, scheint es, dass dies eine dumme Frage war. Experimentieren (im Browser) zeigt an, dass $query und $fname den korrekten Bereichswert für den bestimmten Anruf enthalten, der den Aufruf allDocs ausgelöst hat.

Mit anderen Worten, ich brauche wirklich nichts zu tun, es funktioniert einfach. Offensichtlich hängt dies stark von der JS-Implementierung ab, daher ist die akzeptierte Antwort besser, weil sie explizit angibt, was gewünscht ist.

+0

Ich bin oft erstaunt über die dunkle Zauberei, die JavaScript Variable Scoping ist, und die Fülle der seltsamen Szenarien, die es gerade behandelt. –

Antwort

1

Dies bezieht sich nicht auf PouchDB, es ist eine Lösung, die für alle möglichen ähnlichen Fälle verwendet werden kann.

Die folgende Antwort geht davon aus, dass Sie ein gültiges Promise Objekt haben, das herumhängt.

function DownloadFile($fname){ 
    $query = { 
     include_docs: false, 
     attachments: false, 
     startkey: ['run',$fname].join(','), 
     endkey: ['run',$fname,'\uffff'].join(',') 
    }; 
    return Promise.all([ 
    $query, 
    db.allDocs($query), 
    ]).then(function (resp) { 

    // you'll have your query right here. 
    var $query = resp[0] 
    var result = resp[1] 

    if (result.rows.length !== 0) return; 
    $url = './runDb/' + $fname + '/results.xml'; 
    $.ajax({ 
     url: $url, 
     type: "GET", 
     dataType: "xml", 
     contentType: "text/xml", 
     async: true, 
     success: function (results,status,xhr) { 
     app.ParseResults($fname,results) 
     } 
    }); 
    }).catch(function (err) { 
    console.log(err); 
    }); 
}