【发布时间】:2020-12-24 15:10:19
【问题描述】:
总的来说,我对 Node.js 和 Javascript 还很陌生。 (我也是 StackOverflow 的新手!)最近,我编写了一个 Node.js 应用程序,它占用了太多内存。我读过setTimeout() 可能会导致内存泄漏,而我的代码恰好使用了它。 这是我的代码:
var Scratch = require('scratch-api');
const fetch = require('node-fetch');
require('dotenv').config()
Scratch.UserSession.create(process.env.SCRATCH_USERNAME, process.env.SCRATCH_PASSWORD, function (err, user) {
user.cloudSession(419697811, function (err, cloud) {
let code = ["", "", "", "", "", "", "", "", "", "", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "-", ".", " ", "_"]
var encoded,
idx,
letter_num,
value
function decode(encoded) {
letter_num = 0
value = ""
do {
idx = encoded.charAt(letter_num) + encoded.charAt(letter_num + 1)
letter_num = letter_num + 2
if (Number(idx) < 1) { //evaluates it as a number rather than a string
break
}
value = value + code[Number(idx)]
} while (Number(idx) >= 1)
return value
}
function encode(val) {
temp = "" //so it concatenates strings rather than adding numbers
letter_num = 1
for (letter_num = 0; letter_num < val.length; letter_num++) {
temp += code.indexOf(val.charAt(letter_num))
}
temp += "00" //otherwise it would evaluate to 0
return temp
}
var idle_counter = 0
function timeout() {
setTimeout(function () {
var cloud_check = cloud.get('☁ checkMessage')
if (cloud_check > 0){
if (cloud_check == 1){
cloud.set('☁ checkMessage', 2)
} else if (cloud_check == 2){
idle_counter++
if (idle_counter > 5){
cloud.set('☁ checkMessage', 0)
idle_counter = 0
}
} else if (cloud_check == 3){
if (cloud.get('☁ message') != 0){
var username = decode(cloud.get('☁ message'))
fetch('https://api.scratch.mit.edu/users/' + username + '/messages/count')
.then(res => res.json())
.then(data => {
var message = ""
if (data.code == null) {
message = encode("success." + data.count)
console.log("SUCCESS - Successfully retrieved the message count (" + data.count + ") for the user " + username + "!")
} else {
message = encode("error.user not found")
console.log("ERROR - The user " + username + " could not be found!")
}
cloud.set('☁ message', message)
cloud.set('☁ checkMessage', 4)
idle_counter = 0
})
}
} else {
idle_counter++
if (idle_counter > 5){
cloud.set('☁ checkMessage', 0)
idle_counter = 0
}
}
}
timeout();
}, 2000);
}
timeout() //a loop
});
});
注意:这只是我为连接Scratch而编写的练习代码。非常感谢任何帮助。谢谢!
【问题讨论】:
-
取消嵌套超时函数并为其命名以避免在另一个函数中定义大函数。
-
感谢您的回复!你能告诉我一个示例代码吗?我对此真的很陌生,对不起!谢谢!
标签: javascript node.js memory-leaks