关于异步执行的求助!
发布于 11 年前 作者 hsh075623201 4756 次预览 最后一次回复是 11 年前 来自
格式如下: async.each(role,function(name, cb){ redisClient.get(name,function(err,roleReply){ 。。。。 }) });
async.each(dept,function(name, cb){ redisClient.get(name,function(err,deptReply){ 。。。。。 }) });
分别存在role 以及dept的数组 现根据async,循环从redis中取数据,如何实现这两个函数并行执行,而且知道他们已经执行完成??
15 回复
如果你用 Promise:
.getAsync是 bluebird 给 redis client 自动封装的返回 promise 的函数。能不能不通过计数的方式实现啊 ?
由于是初学者,能否再 说的仔细点呢??
async.parallel和async.map可以帮上忙。 试试下面的代码,没有环境未测试,大概是这个意思。@hsh075623201 做梦吧!你要是学过C语言,就知道,最终都要计数,计算机才能识别。 你用的框架,内部也不过是计数而已。
JS解释到C,C对字符数组都要用末尾‘\0’和指定长度来确认字符串结束。
@GuoZhang 请问如下代码有问题嘛 ?我现在采用了如下方法,但不确定是否可以 由于都是数组,因此我先将数组合并了。。 var getValuesByKey = { getValue:function(key,callback){ var retVal=[]; redisClient.get(key,function(err,roleReply){ for(var i=0;i<JSON.parse(roleReply).component.length;i++){ … retVal.push(); } callback(null, retVal); }) } }
async.map(redisKey, getValuesByKey.getValue.bind(getValuesByKey), function(err, result){ … });
@hsh075623201 感觉没有问题,你实际使用一下吧。
getValuesByKey.getValue.bind(getValuesByKey)在你的情况下似乎没有必要,因为不存在getValue()没有使用this,可以简单地试着写成:或直接匿名:
嗯 好的 谢谢!
@GuoZhang 你好 再次咨询下 代码如下: async.map(MenuPages, function(menuPage, callback) { … menuPage.save(); callback(null); }, function (err, result) { res.json(“success”); }); 我想要完成的是 将menuPages存入数据库 ,然后 返回success 但是上述方法返回后 有时候数据只存入一些,没有全部存入,应该怎么解决呢? 使用mongoose提供的create方法也出现这个问题 ,如下所示: Menu.create(MenuPages,function(err, result){ res.json(“success”); });
@hsh075623201 从你给出来的代码,不太能看到错误。
另外: 将menuPages存入数据库 ,然后 返回success – 在这种情况下,你似乎不需要每个menuPage保存后的返回值,因此,可以不使用
async.map而是使用async.each。简单写了个例子:
执行后查看数据库:
@GuoZhang 你好,我还有些疑问,感觉你贴出来的代码 和我的思路差不多 ,你这段代码不是也将一个个数据保存至数据库,导致还没保存完 就调用callback,是我理解错了吗?
@hsh075623201
所有元素处理完毕的回调在这里:
附上async.each的源码,你体会一下:
@GuoZhang 你好 上面的那个问题 我都过create 方法搞定了 mongoose api [Model.create(doc(s), [fn])], 但是关于异步的疑问仍在 。。。我使用如下方法查询数据,并将有用的数据 返回 ,出现问题 1.返回的有时候 有值 ,有时候没有值 2.不管返回的有值 还是无值 ,打印的地方都没值 。。。 async.map(redisKey, function(key,callback){ var retVal=[]; redisClient.get(key,function(err,roleReply){ for(var i=0;i<JSON.parse(roleReply).menu.length;i++){ for(var j=0;j<docs.length;j++){ … retVal.push(docs[j]); } } callback(null, retVal); }) }, function(err, result){ if(err){ … }else{ var resultArray =[]; for(var i=0;i<result.length;i++){ resultArray = resultArray.concat(result[i]); } console.error(“menu list:”+JSON.stringify(resultArray)); //不管 返回的是有值 还是 无值 这里打印的只有 “[]” res.json(resultArray); }
});
@GuoZhang 我可能找到原因了 我先自己看看 ,非常感谢你的耐心指导!