2013-03-05 1 views
0

Я использую Jaydata как API для индексированного HTML5DB. У меня есть таблица в indexedDB, где мне нужно запросить рекурсивно. Мне нужен обратный вызов, когда весь процесс завершен. Ниже приведена рекурсивная функция. Мне нужно иметь обратный вызов, когда все будет сделано.Обработка обратного вызова в рекурсивных асинхронных вызовах

function getData(idValue) { 
    myDB.MySplDB 
     .filter(function(val) { 
      return val.ParentId == this.parentId; 
     }, {parentId: idvalue}) 
     .toArray(function(vals) { 
      if(vals.length < 1) { 
       // some operation to store the value 
      } else { 
       for (var j=0;j<vals.length;j++) { 
        getData(vals[j].Id); 
       } 
      } 
     }); 
} 

Добавление .done(function(){...}); в .toArray не работает, так как он вызывается до завершения.

ответ

1

(Отказ от ответственности: Я работаю на JayData)

Ждать конца всей вы должны использовать обещания. Вам всегда нужно возвращать обещание. В цикле он становится хитрым, вернул супер обещание. Таким образом, код должен быть что-то вроде этого:

function getData(idValue) { 
    return myDB.MySplDB 
    .filter(function(val) { 
     return val.ParentId == this.parentId; 
    }, {parentId: idvalue}) 
    .toArray(function(vals) { 
     if(vals.length < 1) { 
      // some operation to store the value 
      // important: return a promise from here, like: 
      return myDB.saveChanges(); 
     } else { 
      var promises = []; 
      for (var j=0;j<vals.length;j++) { 
       promises.push(getData(vals[j].Id)); 
      } 
      return $.when.apply(this, promises); 
     } 
    }); 
} 

getData(1) 
.then(function() { 
     // this will run after everything is finished 
}); 

замечания:

  1. этот пример использует JQuery обещания, так что вам нужно JQuery 1.8+ $ .when использует поэтому мы с переменным числом аргументов нужен применить

  2. это может работать с д обещанием с немного другим синтаксисом

+0

В раздел '// какая-то операция для хранения значения', я не сохраняю значение в БД. Я храню их в массиве. Цель состоит в том, чтобы получить все элементы, у которых нет дочерних элементов, т. Е. Идентификатор объекта не является родителем любого другого объекта. – Prabhat

+0

Что еще я должен вернуть вместо 'return myDB.saveChanges(); 'если я не храню значение в БД? – Prabhat

+0

В этом случае вы можете вернуть что угодно, например return true; –

0

Будет ли этот псевдокод иметь смысл в вашем случае?

var helper = function (accu) { 
// Take an id from the accumulator 
// query the db for new ids, and in the db query callback : 
    // If there is child, do "some operation to store the value" (I'm not sure what you're trying to do here 
    // Else add the child to the accumulator 
    // if accu is empty, call the callback, it means you reached the end 

GetData() назвал бы этот помощник с аккумулятором, содержащего первый идентификатор и окончательного обратного вызова