我在我的代码中有while循环,有些条件在其中。但它只是做了第一轮。该循环是函数的一部分。这是我的这部分代码:
else{
var i = 0;
do{
var resmedid = (result.media[i].mediaid);
var len = result.media.length
if(opts.medid1 == resmedid){
var query = {tokenid: opts.token1}
user.findOneAndUpdate(query, {$pull: {media: {_id: result.media[i]._id}}},function(err, result2){
if (err){
console.error(err);
callback(new Error('System Error'));
return;
}
else{
result = 'updated';
callback(null, result);
return;
}
});
break;
}
if (i == len){
console.log(i = len);
result = 'not match';
callback(null, result);
return;
}
i++;
}
while(i < result.media.length);
};
这个循环的作用是查看opts.medid1是否等于一个名为result.media的数组中的字符串。 reesult.media [i] .mediaid是我的数据库中存在的,而opts.medid1是我通过网址得到的。
这就是我的架构的外观:
var userschema = new mongoose.Schema({
userid: {type: String, unique: true},
tokenid: {type: String, sparse: true, default: null},
media: [{
mediaid: String,
mediaurl: String
}]},
{versionKey: false}
);
我做错了什么导致我的while循环卡在第一轮,其中我是0?
提前致谢。
答案 0 :(得分:1)
代码在第一次迭代(i = 0
)退出的原因是break
语句。
根据您的上述代码,这就是您的代码路径的样子,
do while loop
(opts.medid1 == resmedid)
已满足,请继续。user.findOneAndUpdate
,因为它是异步调用,代码将继续运行而不等待它完成执行。break
语句并退出而不完成第一轮循环。不确定 break 语句的意图是什么,但我怀疑它可能只是一个复制粘贴错误,主要是因为它似乎根本不适合代码。同样由于意图未对齐,break
语句看起来确实属于user.findOneAndUpdate
你的回调函数。
我重新缩进了你的代码,使break
更加可辨别,它不属于回调。
do {
var resmedid = (result.media[i].mediaid);
var len = result.media.length
if(opts.medid1 == resmedid) {
var query = {tokenid: opts.token1}
// Note: Async call, code will move on without waiting for it to finish
user.findOneAndUpdate(query, {$pull: {media: {_id: result.media[i]._id}}},function(err, result2){
if (err) {
console.error(err);
callback(new Error('System Error'));
return;
}
else{
result = 'updated';
callback(null, result);
return;
}
});
// Note the break here. This is called right after user.findOneAndUpdate is called
break;
}
if (i == len) {
....
}
i++;
} while(i < result.media.length);
参考: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/break