使用 promise 和递归查找多个随机数据
Find multiple random data using promise and recursion
我需要从我的数据库中检索多个随机数据。
为此,我在 Sails.js 中提供了一项服务。
这是一个递归函数
- 它生成一个随机数 0 来计算我的数据库。
- 存储生成的随机数(所有问题应该不同)
- 得到一个随机问题
- 将其存储在调用 getQuestion 的数组中并返回一个 promise
如果随机生成的数组小于 nb 想要的结果:我们再次调用函数
var RandomizerService= {
// get a random single question
// return a promise
getQuestion: function (limit, skip){
var dfd = q.defer();
Question.find().limit(limit).skip(skip).then(function (question){
dfd.resolve(question);
});
return dfd.promise;
},
// Recursive function
// Generate a random number 0 to count of my DB.
// Stores the random number generated (All questions should be different)
// Get a random Question and store it in an array calling getQuestion and returning a promise
// If the random generated array is smaller than the nb Result wanted :
// We call the function again
questions: function (count, tabRes, tabRand, nbRes){
var dfd = q.defer();
rand = Math.floor(Math.random() * (count - 1)) + 1;
if ( tabRand.indexOf(rand) === -1) {
tabRand.push(rand);
RandomizerService.getQuestion(-1, rand).then(function (result){
console.log(result[0]); // Is Returning AFTER the Randomizer.questions called in the Controller
tabRes.push(result[0]);
});
}
if (tabRand.length<nbRes){
RandomizerService.questions(count, tabRes, tabRand, nbRes);
}
dfd.resolve(tabRes);
return dfd.promise;
}
};
module.exports = RandomizerService;
当我在控制器中调用此函数时
RandomizerService.questions(count, [], [], 30).then(function (randQuestions){
console.log(randQuestions); // Return [];
});
rand 返回空数组的问题。
但是 console.log(result[0]);在 RandomizerService.questions(在 Controller 中)承诺之后,getQuestions 承诺返回! oO
(当使用标准 promise 模拟 find() 时,整个系统都可以工作)。
Waternline 或 Sails 有问题吗?
我做错了什么?
我正在使用 Sails.js 0.11 并且我使用 sails.disk 但我将来会使用 mongDB :)
谢谢大家:)
第一个问题是您立即解决了承诺,第二个问题是我认为您的 if 语句设置不正确。试试这个:
questions: function (count, tabRes, tabRand, nbRes){
var dfd = q.defer();
rand = Math.floor(Math.random() * (count - 1)) + 1;
if ( tabRand.indexOf(rand) === -1) {
tabRand.push(rand);
RandomizerService.getQuestion(-1, rand).then(function (result){
console.log(result[0]); // Is Returning AFTER the Randomizer.questions called in the Controller
tabRes.push(result[0]);
if (tabRand.length<nbRes){
RandomizerService.questions(count, tabRes, tabRand, nbRes)
.then(function(res){
dfd.resolve(res);
})
}
else {
dfd.resolve(tabRes);
}
});
}
else if (tabRand.length<nbRes){
RandomizerService.questions(count, tabRes, tabRand, nbRes)
.then(function(res){
dfd.resolve(res);
})
}
else {
dfd.resolve(tabRes);
}
return dfd.promise;
}
我需要从我的数据库中检索多个随机数据。
为此,我在 Sails.js 中提供了一项服务。
这是一个递归函数
- 它生成一个随机数 0 来计算我的数据库。
- 存储生成的随机数(所有问题应该不同)
- 得到一个随机问题
- 将其存储在调用 getQuestion 的数组中并返回一个 promise
如果随机生成的数组小于 nb 想要的结果:我们再次调用函数
var RandomizerService= { // get a random single question // return a promise getQuestion: function (limit, skip){ var dfd = q.defer(); Question.find().limit(limit).skip(skip).then(function (question){ dfd.resolve(question); }); return dfd.promise; }, // Recursive function // Generate a random number 0 to count of my DB. // Stores the random number generated (All questions should be different) // Get a random Question and store it in an array calling getQuestion and returning a promise // If the random generated array is smaller than the nb Result wanted : // We call the function again questions: function (count, tabRes, tabRand, nbRes){ var dfd = q.defer(); rand = Math.floor(Math.random() * (count - 1)) + 1; if ( tabRand.indexOf(rand) === -1) { tabRand.push(rand); RandomizerService.getQuestion(-1, rand).then(function (result){ console.log(result[0]); // Is Returning AFTER the Randomizer.questions called in the Controller tabRes.push(result[0]); }); } if (tabRand.length<nbRes){ RandomizerService.questions(count, tabRes, tabRand, nbRes); } dfd.resolve(tabRes); return dfd.promise; } }; module.exports = RandomizerService;
当我在控制器中调用此函数时
RandomizerService.questions(count, [], [], 30).then(function (randQuestions){
console.log(randQuestions); // Return [];
});
rand 返回空数组的问题。
但是 console.log(result[0]);在 RandomizerService.questions(在 Controller 中)承诺之后,getQuestions 承诺返回! oO
(当使用标准 promise 模拟 find() 时,整个系统都可以工作)。
Waternline 或 Sails 有问题吗? 我做错了什么?
我正在使用 Sails.js 0.11 并且我使用 sails.disk 但我将来会使用 mongDB :)
谢谢大家:)
第一个问题是您立即解决了承诺,第二个问题是我认为您的 if 语句设置不正确。试试这个:
questions: function (count, tabRes, tabRand, nbRes){
var dfd = q.defer();
rand = Math.floor(Math.random() * (count - 1)) + 1;
if ( tabRand.indexOf(rand) === -1) {
tabRand.push(rand);
RandomizerService.getQuestion(-1, rand).then(function (result){
console.log(result[0]); // Is Returning AFTER the Randomizer.questions called in the Controller
tabRes.push(result[0]);
if (tabRand.length<nbRes){
RandomizerService.questions(count, tabRes, tabRand, nbRes)
.then(function(res){
dfd.resolve(res);
})
}
else {
dfd.resolve(tabRes);
}
});
}
else if (tabRand.length<nbRes){
RandomizerService.questions(count, tabRes, tabRand, nbRes)
.then(function(res){
dfd.resolve(res);
})
}
else {
dfd.resolve(tabRes);
}
return dfd.promise;
}