大佬教程收集整理的这篇文章主要介绍了Node.js和Redis;等待循环完成,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一组我需要使用redis’get方法查询的id.并且在检查了某个值之后(假设我正在检查给定“key”的对象是否具有空名称),我将它们添加到列表中.这是我的示例代码;
var finalList = []; var list = []; redisClient.smembers("student_list",function(err,result){ list = result; //id's of students console.log(result); var possiblestudents = []; for(var i = 0; i < list.length; i++){ redisClient.get(list[i],result){ if(err) console.log("Error: "+err); else{ tempObject = JSON.parse(result); if(tempObject.name != null){ finalList.push(tempObject); } } }); } }); console.log("Goes here after checking every single object");
但正如预期的那样,由于Node的异步特性,如果不检查列表中的每个id,它就会执行“Goes here …”.我需要在检查每个id后应用其余的过程(在redis db中映射并检查名称).但我不知道该怎么做.也许如果我可以将回调附加到for循环并确保我的其余函数在循环结束后开始运行(我知道这是不可能的但只是给出一个想法)?
function getstudentsData(callBACk) { var setList = []; var dataList = []; redisClient.smembers("student_setList",result) { setList = result; //id's of students for(var i = 0; i < setList.length; i++) { redisClient.get(setList[i],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 code here });
这可能是最有效的方法;或者你可以在循环中依赖旧学校,直到数据准备就绪:
var finalList = []; var list = [0]; redisClient.smembers("student_list",result) { list = result; //id's of students var possiblestudents = []; for(var i = 0; i < list.length; i++) { redisClient.get(list[i],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 code 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,而不是在它之外.其他场景需要的解决方案与传统的程序编码有所不同,但是一旦你了解它@R_867_10585@事件驱动,非阻塞实际上是一个非常强大的功能.
以上是大佬教程为你收集整理的Node.js和Redis;等待循环完成全部内容,希望文章能够帮你解决Node.js和Redis;等待循环完成所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。