Вызов асинхронной функции mongodb из рекурсивного тайм-аута, я полагаю, ошибка контекста - PullRequest
0 голосов
/ 04 ноября 2018

Я только что попытался вызвать асинхронную функцию монго (updateAdded) из рекурсивного setTimeout. Однако я обнаружил ошибку контекста: UnhandledPromiseRejectionWarning: MongoError: Topology was destroyed.

async function updateAdded(followersToAdd, username = 'blower1223', db = amng){
    const lel = await db.find({collection:COLLECTION, where: {username: username}});
    const all = await lel[0].followersAdded + followersToAdd;
    await amng.update({
        collection: COLLECTION,
        where: { username: username },
        row: { followersAdded: all }
    })
}

await amng.connect();
const loginInfo = await amng.find({ collection: COLLECTION }, {});
console.log(loginInfo);
let temp = [];
loginInfo.map((user) => {
    temp.push(new Instagram({ username: user.username, password: user.password }))
});
const users = temp;
temp = [];
let that = this;


let timerId = setTimeout(async function approveSession() {
    for (let i = 0; i < users.length; i++) {
        const client = users[i];
        await client.login();
        const req = await client.getFollowRequests();
        console.log(req);
        await updateAdded(req.length); 
        for (let i = 0; i < req.length; i++) {
            const elem = req[i];
            await client.approve({ userId: elem.node.id });
        }
    } 
    timerId = setTimeout(approveSession, 3000);
}, 3000);

Я пытался использовать updateAdded.call(that, req.length), но это не решило проблему.

1 Ответ

0 голосов
/ 07 ноября 2018

причина минусов, я могу понять, что я не очень хороший кодер, но, возможно, есть кто-то более глупый, чем я, поэтому я выложу здесь наиболее подходящее решение:

function promisifiedDelay(delay) {
    return new Promise(function (fulfill) {
        setTimeout(fulfill, delay)
    })
}
while (true) {
    await promisifiedDelay(3000);
    users.map(async(client) => {
        await client.login();
        const requests = await client.getFollowRequests();
        console.log(requests);
        await updateAdded(requests.length, await client.getCurUsername());
        requests.map(async(request) => {
            await client.approve({ userId: request.node.id });
        })
    });
}
...