2015-11-04 3 views
1

У меня есть эта рекурсивная функция, где мне нужно вернуть некоторые данные после завершения функции.Как вернуть данные javascript из функции с помощью рекурсивного вызова

// Set Up my Database paramaters 
var coachdb = new AWS.DynamoDB({ 
    ... 
}); 

// This tracks the array index of the current parameter. 
var pos = 0; 

function callback(err, data) { 
    if (err) { 
    console.log(err, err.stack); 
    } else if (data.Items.length > 0) { 

    //return data.Items // Where I need something here to return data 

    } else if (++pos < params.length) {  // Increment the index. 
    coachdb.query(params[pos], callback); // Recursive call. 
    } 
} 

coachdb.query(params[pos], callback); // Kick off the series of calls 

Все внутри функции работает нормально. Я обращаюсь к моей базе данных, просто тщательно повторяя возможные параметры до тех пор, пока не будет найден правильный, а затем функция прекратится.

Однако я не уверен, как передавать данные вне функции. Любая помощь будет оценена по достоинству.

ответ

2

Это не возможно, вместо того, чтобы возвращать данные, вам нужно написать свою логику внутри обратного вызова.

EDIT: Если вы не хотите иметь грязный код, вам нужно реорганизовать свой код и извлечь код для разделения методов;

function callback(err, data) { 
    if (err) { 
    errorLogic(err); 
    } else if (data.Items.length > 0) { 
    successLogic(data.Items); 
    } else if (++pos < params.length) {  // Increment the index. 
    coachdb.query(params[pos], callback); // Recursive call. 
    } 
} 
+0

Как я могу это сделать? Будет ли это хорошим способом сделать что-то подобное, или это будет слишком грязно? –

+0

@JaredWhipple проверить мое редактирование – Almis

0

Другой идеей было бы использование обещаний обойти необходимость обратного вызова. Взгляните на нано, например (http://www.mircozeiss.com/async-couchdb-queries-with-nano-and-promises/). По сути, у вас есть объект, который будет «в какой-то момент» содержать данные вашей базы данных и в этот момент времени вызывается функция события.

псевдокод:

var myPromise = couchdb.insert(...); 

myPromise.success(function (mydata){ 
    // here you can fiddle around with your data 
})