while循环结束于零

时间:2016-07-16 11:30:15

标签: node.js mongoose while-loop

我在我的代码中有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?

提前致谢。

1 个答案:

答案 0 :(得分:1)

代码在第一次迭代(i = 0)退出的原因是break语句。

根据您的上述代码,这就是您的代码路径的样子,

  1. 进入do while loop
  2. 初始化一些变量
  3. 假设条件(opts.medid1 == resmedid)已满足,请继续。
  4. 调用user.findOneAndUpdate,因为它是异步调用,代码将继续运行而不等待它完成执行。
  5. 代码读取break语句并退出而不完成第一轮循环。
  6. 不确定 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