![](/img/trans.png)
[英]how to fix mutable variable is accessible from closure warning with a while 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.