Node.js和Redis; 等待循环结束

Node.js和Redis; 等待循环结束,第1张

Node.js和Redis; 等待循环结束

我会按照您在问题中建议的路线进行 *** 作,并将自定义回调附加到您的提取函数中:

function getStudentsData(callback) {    var setList = [];    var dataList = [];    redisClient.smembers("student_setList", function(err,result) {        setList = result; //id's of students        for(var i = 0; i < setList.length; i++) { redisClient.get(setList[i], function(err, result) {     if(err) {         console.log("Error: "+err);     } else {         tempObject = JSON.parse(result);         if(tempObject.name != null) {  dataList.push(tempObject);         }     } });  }        if(dataList.length == setList.length) { if(typeof callback == "function") {     callback(dataList); } console.log("getStudentsdata: done");        } else { console.log("getStudentsdata: length mistmach");        }    });}getStudentsData(function(dataList) {    console.log("Goes here after checking every single object");    console.log(dataList.length);    //More pre here});

那可能是最有效的方法。或者,您可以依靠旧的

while
循环,直到数据准备就绪:

var finalList = [];var list = [0];redisClient.smembers("student_list", function(err,result) {    list = result; //id's of students    var possibleStudents = [];    for(var i = 0; i < list.length; i++) {        redisClient.get(list[i], function(err, result) { if(err) {     console.log("Error: "+err); } else {     tempObject = JSON.parse(result);     if(tempObject.name != null) {         finalList.push(tempObject);     } }        });         }});process.nextTick(function() {    if(finalList.length == list.length) {        //Done        console.log("Goes here after checking every single object");        console.log(dataList.length);        //More pre here    } else {        //Not done, keep looping        process.nextTick(arguments.callee);    }});

我们使用

process.nextTick
而不是实际的方法
while
来确保在此期间其他请求不会被阻止;由于Javascript具有单线程特性,因此这是首选方式。为了完整起见,我将其放入其中,但是前一种方法效率更高,并且更适合与node.js配合,因此,除非涉及重大重写,否则请继续进行下去。

两种情况都依赖异步回调是毫无价值的,这意味着它之外的任何代码仍然可以在其他代码完成之前运行。例如,使用我们的第一个片段:

function getStudentsData(callback) {    //[...]}getStudentsData(function(dataList) {    //[...]});console.log("hello world");

几乎可以保证最后一个console.log在触发传递给getStudentsData的回调之前可以运行。解决方法?为此进行设计,这就是node.js的工作方式。在上面的例子中,这很容易,我们
在传递给getStudentsData的回调中调用console.log
,而不在其外部调用。其他场景要求的解决方案与传统的过程编码有更多的区别,但是一旦掌握了这一点,您就会发现事件驱动和非阻塞实际上是一个非常强大的功能。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4963220.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存