Последняя функция затем вызывается несколько раз - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь написать цепочку Обещаний, но последний .then () вызывается несколько раз, и я не знаю почему. Последний .then () должен запускаться один раз, поскольку он будет вызывать другой API, передавая result в качестве тела.

Я знаю, что он вызывается несколько раз, потому что я регистрируюсь как console.log ().

Что не так в моем коде? Насколько я понимаю, тогда () следует подождать, обещание возвращает что-то.

app.post('/router/join', function(req, res){
    let data = req.body;
    sessions.validate(data)
    .then(result => {
        return {
            authenticated: (result.code === 201)                
        };
    })
    .then(result => {        
        if(result.authenticated){
            return contacts.getContacts(data.tenant_id).then(cs => {
                let json = merge(result, cs.data);            
                return Promise.all(cs.data.items.map(contact => {
                    return messages.getLastMessage(data.tenant_id, contact.item.contact_id, data.hash_id)
                        .then(result => {
                            contact.item.last_message = result.code === 200 && result.data.length > 0 ? result.data[0] : null;
                            return contact;
                        });                    
                })).then(result => {
                    json.items = result;
                    return json;
                });            
            });
        } else {
            return result;
        }        
    })
    .then(result => {
        //this call should run after all other promises and only a single time
        let event = result.authenticated ? 'valid_session' : 'invalid_session';
        console.log('222');
        proxy.send(event, result)}
    )
    .catch(err => {
        console.log('333');
        proxy.send('invalid_session', {socket_id: data.socket_id})
    })
    res.status(201).send({});
});

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете использовать async / await для очистки. Внутри асинхронных функций вы можете ожидать результатов обещаний.

app.post('/router/join', async function (req, res, next) {
    try {
        let data = req.body;
        let {code} = await sessions.validate(data);
        let result = { authenticated: (code === 201) };     
        if (result.authenticated) {
            let cs = await contacts.getContacts(data.tenant_id);
            let json = merge(result, cs.data);            
            let items = Promise.all(cs.data.items.map(async contact => {
                let result = await messages.getLastMessage(data.tenant_id, contact.item.contact_id, data.hash_id)
                contact.item.last_message = result.code === 200 && result.data.length > 0 ? result.data[0] : null;
                return contact;
            }));   
            json.items = items;
            result = json;
        }
        let event = result.authenticated ? 'valid_session' : 'invalid_session';
        console.log('222');
        proxy.send(event, result);
        res.status(201).send({});
    } catch (err) {
        proxy.send('invalid_session', {socket_id: data.socket_id})
        next (err);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...