原始问题:
这是我的问题,我有一个用于登录帐户的令牌列表,可以完全随机地分配这些项目,但我想删除我使用了大约30秒钟的令牌,因为在此期间该帐户正在使用中,其他任何人都不能使用。我如何能够在一段时间内从阵列中删除令牌,并在x时间后将其放回阵列中? (30秒)。
我想到的解决方案:
我创建了2个函数,一个函数从数组中检索随机令牌,另一个函数实际执行用于删除令牌并将其放入x的时间(30秒)内的函数
我的代码:
const tokens = ["Token1", "Token2", "Token3"]; // Tokens
function runToken(index, value) { // Does the work of removing the element from the array and placing it back in the array.
tokens.splice(index, 1); // Removes the chosen token from the array
setTimeout(() => { // waits 5 seconds to push the array element back
tokens.push(value); // Action to push it back
}, 30000);
}
function getActiveToken() { // Function to use in order to get the item from the array
let chosenToken = tokens[Math.floor(Math.random() * tokens.length)]; // Chooses a random element avaliable in the array
let chosenTokenIndex = tokens.indexOf(chosenToken); // Retrieves the index for use later
runToken(chosenTokenIndex, chosenToken); // Runs the function above to remove the token and push it back later
return chosenToken; // Returns the token so that you can use it.
}
console.log(getActiveToken());
//-- "Token1"
如果您有更有效的方法,我希望看到它!
答案 0 :(得分:0)
随着数组大小的增加,添加和删除项目可能会成为昂贵的操作。因此,作为这种情况下的替代方案,我们可以使用“交换”。每当我们随机选择一个项目时,将其与最后一个元素交换,并将其从选择范围中排除特定的时间。
const tokens = ["Token1", "Token2", "Token3", "Token4" , "Token5", "Token6" ];
const delay = 2000; // 2 Seconds
function getToken() {
if( getToken.limit == undefined ){
getToken.limit = getToken.limit || tokens.length;
} else if (getToken.limit == 0) {
return "No Active token";
}
var index = Math.floor(Math.random()* getToken.limit );
var activeToken = tokens[index];
tokens[index] = tokens[getToken.limit-1];
tokens[getToken.limit-1] = activeToken;
getToken.limit --;
setTimeout(function() {
getToken.limit ++;
},delay);
return activeToken;
};
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
setTimeout(function(){
console.log(getToken());
},3000);