2016-07-15 3 views
0

Я пытаюсь загрузить локальный пакет PouchDB с результатами веб-сайта. Как только результаты загружаются локально, я не хочу беспокоиться о том, что вы загружаете их снова.pouchDB получить всеDocs исходный запрос

Чтобы избежать этого, я получаю список существующих файлов, а затем проверяю, загружал ли я его в прошлом, прежде чем извлекать его.

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

Проблема, которую я имею пока что к тому времени DownloadFile ПОЛУЧИТЬ Называется 100 раз и allDocs запрос, наконец, возвращается что-то, я уже не знаю, что первоначальный запрос, который не дал результатов.

Есть ли способ в PouchDb определить параметры запроса, которые использовались для создания заданного набора результатов?

EDIT: Хотя мне действительно нравится принятый ответ, похоже, это был немой вопрос. Эксперимент (в браузере) указывает, что $query и $fname будут содержать правильное облачное значение для конкретного вызова, инициировавшего вызов allDocs.

Другими словами, мне не нужно ничего делать, это просто работает. Очевидно, что это сильно зависит от реализации JS, поэтому принятый ответ лучше, потому что он явно о желании.

+0

Меня часто поражает темное волшебство, которое представляет собой область видимости переменной javascript, и множество странных сценариев, которые она обрабатывает. –

ответ

1

Это не относится к PouchDB, это решение, которое может использоваться для всех видов подобных случаев.

Ответ на этот вопрос предполагает, что у вас есть действительный объект Promise.

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); 
    }); 
} 
Смежные вопросы