如何使用Node.js处理while循环内的异步操作?
对于Node API,我必须生成一个随机的字母数字键,这应该是唯一的,并且SHORT(我不能使用uuid或Mongo ObjectID)。如何使用Node.js处理while循环" title="while循环">while循环内的异步操作?
我觉得这样的逻辑:
- 生成密钥,
- 查询的MongoDB重点所有脑干
- 如果键存在,重复上述过程,
- 如果键不存在,其分配和回应客户。
我试过那么:
do { key = randomKey(8);
newGroup.key = key;
Group.findOne({numberId: key}).then(function (foundGroup) {
console.log("cb");
if (! foundGroup) {
console.log("not found")
notUnique = false;
}
}).catch(function (err) {
return response.send(500);
});
} while (notUnique);
但是,只有我是一个无限循环,notUnique
是从未切换到true
。以防万一,这是针对empy数据库进行测试的。
我怎么能实现它?
回答:
你可以用异步模块做到这一点很容易:
var async = require('async') async.forever(
function(next) {
key = randomKey(8);
Group.findOne({numberId: key}).then(function (foundGroup) {
console.log("cb");
if (! foundGroup) {
console.log("not found")
notUnique = false;
next(new Error(), key) // break forever loop with empty error message and the key
}
else
return next() //continue loop
}).catch(function (err) {
next(err); //break loop
return response.send(500);
});
},
function(err, key) {
if(key){
newGroup.key = key;
}
}
);
回答:
既然你已经在使用的承诺,我会做这样的事情:创建一个递归返回一个承诺的功能,创建一个承诺链,并且当条件不满足时最终抛出错误。然后你只需要抓住最后的错误。
编辑:更新回到这里的关键
function find(){ var key = randomKey(8);
return Group.findOne({numberId: key })
.then(function(foundGroup) {
if(foundGroup) return find(); // recursion
else throw key;
}).catch(function(err){ // in case Group.findOne throws
throw key;
});
}
find().catch(function(key){
return response.send(key);
});
的find
功能将保持自称只要递归,因为它使找到一个有效的对象。而且由于它返回一个承诺,它们都将被自动链接。
如果并最终在没有找到该对象时,或者Group.findOne
会引发错误,则会抛出该键。
find().catch
将捕获最终的错误,这将是关键。
以上是 如何使用Node.js处理while循环内的异步操作? 的全部内容, 来源链接: utcz.com/qa/261476.html