Убедитесь, что обещания не просочились в конце асинхронной функции - PullRequest
0 голосов
/ 01 июля 2018

Я планирую использовать async / await для запуска многих задач. Поскольку я не могу позволить себе ждать выполнения задач, потому что основной цикл будет продолжать порождать новые задачи, я должен убедиться, что обещание для этой задачи будет уничтожено в конце. Имеет ли следующий фрагмент кода утечку обещаний? Если есть лучший способ добиться этого, пожалуйста, дайте мне знать.

const fetch = require ('node-fetch')

var gId = 0;
var ps = {}

var lId = gId; gId ++;
ps[lId] = task(lId)
lId = gId; gId ++;
ps[lId] = task(lId)
//will add many more tasks


async function task(id) {
    console.log("starting..")
    var url = "http://localhost/prod/te.php";
    var r1 = await fetch(url).then((r) => r.text())
    console.log(new Date() + "|" + id)
    await wait(parseInt(r1) * 1000)
    var r2 = await fetch(url).then((r) => r.text())
    console.log(new Date + "|" + id)
    ps[id].then(() => console.log("deleted promise " + id))
    delete ps[id]
}

async function wait(ms) {
    return new Promise (function (resolve, reject) {
        setTimeout(function() {
            console.log("expired")
            resolve(0)
        }, ms)
    })
}

1 Ответ

0 голосов
/ 02 июля 2018

Сделал несколько тестов и все сводится к тому, что обещания не будут пропущены вообще (что, как я опасался, приведет к утечке памяти). Долгое время запускал следующий код, а потребление памяти на моем Mac колебалось около 100 МБ.

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)
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...