2014-12-01 5 views
0

У меня есть функция с обратным вызовом, где я использую метод «listTables» dynamoDB, который возвращает только 100 имен таблиц, а если есть больше таблиц, он возвращает другое поле «LastEvaluatedTableName», которое мы можем использовать в нашем новом запросе в listTables для запроса еще 100 таблиц из упомянутого «LastEvaluatedTableName»; как я могу иметь рекурсию в обратных вызовах в javascript в этой логике?Рекурсивный в функции обратного вызова

Я попытался следующие, не является правильным:

module.exports.ListTables = function (start, callback) { 
    var params; 
    if (start) { 
     params = { 
      "ExclusiveStartTableName": start 
     }; 
    } 

    dynamodb.listTables(params, function (err, data) { 
     var totalData = []; 
     totalData.push(data); 
     if (data.LastEvaluatedTableName) { 
      data = module.exports.ListTables(data.LastEvaluatedTableName); 
     } 
     callback(err, totalData); 

    }); 
} 

Пожалуйста, дайте мне знать, если вам нужно больше уточнений!

Спасибо!

ответ

0

Вы должны Concat данные, а не заменять его каждый раз:

dynamodb.listTables(params, function (err, data) { 
    if (data.LastEvaluatedTableName) { 
     data.concat(module.exports.ListTables(data.LastEvaluatedTableName)); 
    } 
    callback(err, data); 
}); 

UPDATE

Основываясь на информации из комментария, звучит, как вам нужно что-то вроде этого:

module.exports.ListTables = function (start, callback, totalData) { 
    var params; 
    if (start) { 
     params = { 
      "ExclusiveStartTableName": start 
     }; 
    } 

    if (!totalData) { 
     totalData = []; 
    } 

    dynamodb.listTables(params, function (err, data) { 
     totalData = totalData.concat(data.TableNames); 
     if (data.LastEvaluatedTableName) { 
      module.exports.ListTables(data.LastEvaluatedTableName, callback, totalData); 
     } 
     else { 
      callback(err, totalData); 
     } 
    }); 
} 
+0

Thansk so much man :-) Actuatly результат ListTables из Dynamo: {LastEvaluatedTableName: 'test100', TableNames: ['test1', ...]} и, похоже, это не добавляет результатов! – user385729

+1

Добро пожаловать! О, я вижу, вы знаете, как добавить нужные вещи? – Shomz

+0

это объект, поэтому он дает «» Объект # не имеет метода «concat», поэтому я попробовал data.TableNames.concat (module.exports.ListTables (data.LastEvaluatedTableName) .TableNames), и это дает «Невозможно прочитать свойство 'TableNames' of undefined " – user385729

Смежные вопросы