簡體   English   中英

可變變量可通過帶有promise和loop的閉包進行訪問

[英]Mutable variable is accessible from closure with promise and loop

我使用以下代碼為用戶生成唯一的令牌。 用戶的數據存儲在MongoDB上,因此我使用promise處理與數據庫的異步對話。 在WebStorm中,我收到此警告: Mutable variable is accessible from closure with promise and loop. 而且我知道有關於此事的帖子,但是我的情況更復雜。 我知道我什至不必擔心它,因為我僅使用token的最后一個值,但是我想以正確的方式解決此問題呢?

  var generateToken = function(userId) {
        User.findOne({userId: userId}, function(err, user) {
            if (user !== null) {
                var loop = true;
                while (loop) {
                    var token = Common.randomGenerator(20);
                    User.find({tokens: token}, function(err, result) {
                        if (err) {
                            loop = false;
                            return Promise.reject('Error querying the database');
                        } else {
                            if (result.length === 0) {
                                if (user.tokens === undefined){
                                    user.tokens.push(token);
                                }
                                loop = false;
                                return Promise.resolve(token);
                            }
                        }
                    });
                }
            } else {
                return Promise.reject('UserNotFound');
            }
        });
   };

我想出了以下解決方案,對嗎?

var generateToken = function(userId) {
    User.findOne({userId: userId}, function(err, user) {
        if (user !== null) {
            var loop = true;
            while (loop) {
                var token = Common.randomGenerator(20);
                (function(e){
                    User.find({tokens: e}, function(err, result) {
                        if (err) {
                            return Promise.reject('Error querying the database');
                        } else {
                            if (result.length === 0) {
                                if (user.tokens === undefined){
                                    user.tokens = [];
                                }
                                user.tokens.push(e)
                                return Promise.resolve(e);
                            }
                        }
                    });
                })(token);
            }
        } else {
            return Promise.reject('UserNotFound');
        }
    });
};

注意:正如@Alex Nikulin所建議的那樣,我在將承諾結果發送回之前將loop翻轉為false 但這仍然是一個無限循環,因為它沒有進入User.find({tokens: e})....

您的問題是,return語句在函數內,而不在循環內。您的循環是無限的。 我已經分解了您的代碼,或者在您解析/拒絕promise時簡單地將loop設為false。 同樣,我的代碼將等待用戶的每個答案,錯誤將消失。 並且帶有wrap函數的變量是正確的(function(e){})(token)

var generateToken = function(userId) {
        return new Promise(function(resolve, reject) {
                User.findOne({userId: userId}, function(err, user) {
                    if (user !== null) {
                            userTokenIterator(user,resolve, reject);   
                        } else {
                            reject('UserNotFound');
                        }
                });
        });
       };

    var addTokenToUser = function(token,user){
            return new Promise(function(resolve, reject) {
                      User.find({tokens: token}, function(err, result) {
                        if (err) {
                                reject('Error querying the database');
                        } else {
                                   var result = result.length === 0;
                                if (result) {
                                      if(!user.tokens)  {
                                             user.tokens = []
                                      }
                                      user.tokens.push(token);
                                 } 
                                    resolve(result);    
                        }
            });
            }); 
    };
    var userTokenIterator = function (user, resolve, reject){
            var token = Common.randomGenerator(20);
        addTokenToUser(token, user).then(function(result){
                  if(result) {
                      resolve(token);
                  }else{ 
                      userTokenIterator(user,resolve, reject)
                  }                     
            },function(error){
                   reject(error);
            }); 
    };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM