gpt4 book ai didi

javascript - 使用 Promise 和递归查找多个随机数据

转载 作者:行者123 更新时间:2023-12-03 10:46:04 25 4
gpt4 key购买 nike

我需要从数据库中检索多个随机数据。

我为此目的在 Sails.js 中提供了一项服务。

这是一个递归函数

  1. 它会生成一个随机数 0 来计数我的数据库。
  2. 存储生成的随机数(所有问题都应该不同)
  3. 获取随机问题
  4. 将其存储在一个数组中,调用 getQuestion 并返回一个 Promise
  5. 如果随机生成的数组小于想要的 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;

当我在 Controller 中调用此函数时

RandomizerService.questions(count, [], [], 30).then(function (randQuestions){ 
console.log(randQuestions); // Return [];
});

rand返回空数组时的问题。

但是console.log(result[0]); getQuestions promise 内部在 RandomizerService.questions (在 Controller 中) promise 之后返回! oO

(当使用标准 Promise 模拟 find() 时,整个系统可以正常工作)。

Waternline 或 Sails 有问题吗?我做错了什么?

我正在使用 Sails.js 0.11,并且我使用 sails.disk,但将来我将使用 mongDB :)

谢谢大家:)

最佳答案

第一个问题是您立即解决 promise ,第二个问题是我认为您的 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;
}

关于javascript - 使用 Promise 和递归查找多个随机数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28568480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com