gpt4 book ai didi

javascript - 在第 n 个 setTimeout 中解决的 Promise 是否会导致内存泄漏?

转载 作者:行者123 更新时间:2023-12-03 02:29:33 26 4
gpt4 key购买 nike

我可以在 Chrome 任务管理器中看到运行以下代码的选项卡占用越来越多的内存,并且直到 promise 解决后才会释放

更新

这里的主要思想是使用单个“低级”方法来处理来自服务器的“繁忙”响应。其他方法只是将带有请求数据的 url 路径传递给它并等待有值(value)的响应。

删除了一些反模式。

var counter = 1

// emulates post requests sent with ... axios
async function post (path, data) {
let response = (counter++ < 1000) ? { busy: true } : { balance: 3000 }
return Promise.resolve(response)
}

async function _call (path, data, resolve) {
let response = await post()

if (response.busy) {
setTimeout(() => {
_call(path, data, resolve)
}, 10)
throw new Error('busy')
}

resolve(response.balance)
}

async function makePayment (amount) {
return new Promise((resolve, reject) => {
_call('/payment/create', {amount}, resolve)
})
}

async function getBalance () {
return new Promise((resolve, reject) => {
_call('/balance', null, resolve)
})
}

makePayment(500)
.then(() => {
getBalance()
.then(balance => console.log('balance: ', balance))
.catch(e => console.error('some err: ', e))
})

最佳答案

第一次在这里调用_call():

async function getBalance () {
return new Promise((resolve, reject) => {
_call('/balance', null, resolve)
})
}

它不会调用解析回调,并且会返回一个被拒绝的 Promise,因此 getBalance() 中的 new Promise() 最初不会执行任何操作。请记住,由于 _call 被标记为 async,因此当您抛出时,它会被捕获并变成拒绝的 Promise。

当计时器触发时,它将调用 resolve() 并解析 getBalance() promise ,但它不会有值,因此您不会没有得到你的平衡。当您最终调用 resolve(response.balance) 时,您已经调用了该 resolve() 函数,因此它所属的 Promise 已被锁定并且不会被锁定改变它的值。

<小时/>

正如其他人所说,这段代码存在各种各样的问题(很多反模式)。这是一个简化版本,当我在 node.js 或答案中的代码片段中运行它时,它可以工作:

function delay(t, val) {
return new Promise(resolve => {
setTimeout(resolve.bind(null, val), t);
});
}


var counter = 1;

function post() {
console.log(`counter = ${counter}`);
// modified counter value to 100 for demo purposes here
return (counter++ < 100) ? { busy: true } : { balance: 3000 };
}

function getBalance () {

async function _call() {
let response = post();

if (response.busy) {
// delay, then chain next call
await delay(10);
return _call();
} else {
return response.balance;
}
}

// start the whole process
return _call();
}

getBalance()
.then(balance => console.log('balance: ', balance))
.catch(e => console.error('some err: ', e))

关于javascript - 在第 n 个 setTimeout 中解决的 Promise 是否会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48796868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com