我计划使用async / await运行许多任务。由于主循环将不断产生新任务,因此我无法等待任务,因此我需要确保最后对任务的承诺被破坏。以下代码段是否存在承诺的泄漏?如果有更好的方法可以做到这一点,请也告诉我。
addAlert.addTextField(configurationHandler: { (textField) -> Void in
textField.placeholder = "ABC 123"
textField.textAlignment = .left
textField.backgroundColor = Theme.current.barColor
textField.textColor = Theme.current.titleColor
textField.attributedPlaceholder = NSAttributedString(string: "ABC 123", attributes: [NSAttributedStringKey.font : UIFont.systemFont(ofSize: 14, weight: .regular), NSAttributedStringKey.foregroundColor : Theme.current.subTitleColor])
textField.layer.borderWidth = 1.0
textField.layer.borderColor = Theme.current.subTitleColor.cgColor
textField.layer.backgroundColor = Theme.current.barColor.cgColor
})
答案 0 :(得分:1)
进行了一些测试之后,promise根本不会泄漏(正如我担心的那样,这将导致内存泄漏)。长时间运行以下代码,Mac上的内存消耗徘徊在100MB左右。
const fetch = require ('node-fetch')
var gId = 0;
start()
async function start() {
var lId;
var count = 0;
while (1) {
lId = gId; gId ++;
task(lId)
count ++;
if (count == 100) {
count = 0;
await wait(500)
}
}
}
async function task(id) {
var url = "http://localhost/prod/te.php";
var r1 = await fetch(url).then((r) => r.text())
await wait(parseInt(r1) * 1000)
var r2 = await fetch(url).then((r) => r.text())
}
async function wait(ms) {
return new Promise (function (resolve, reject) {
setTimeout(function() {
resolve(0)
}, ms)
})
}