разрешить обещание на socket.write при ошибке (nodejs) - PullRequest
0 голосов
/ 26 октября 2018

У меня есть проблема, как resolve обещание для функции send(), если socket.write() приводит к ошибке, сокет nodejs не генерирует исключение , когда операция записи является ошибкой

пока я все еще получаю уведомление от this.socket.on('error',..) обратного вызова, если во время записи в сокет произошла ошибка, но я все еще не могу разрешить обещание, поэтому вызов send() застрял

что яхочу, чтобы пользователь мог просто использовать send().then((result) => {}), и, если есть ошибка, он может прочитать его на result аргумент

socket.on('error',(err) => {
    console.error(err); //if there are error this will be called
});

async send(data){
    return new Promise(resolve, () => {
        try{
            socket.write(data, 'binary',() => {
                resolve(true); //data sent, resolve the promise
            });
        }
        catch(e){ //nodejs socket.write does not throw exception
            resolve(false);
        }
    })
}

//call send, and wait for results
send({..}).then((result) => {
    if(result === true){
         //send success
    }
    else {
         //send failed
    }
});

, этот работает должным образом, когда есть ошибка, обещание все еще разрешено

async send(data){
    return new Promise(resolve, () => {
        try{
            let errorHandler = (err) => {
                resolve(false);
            }
            socket.once('error', errorHandler);
            socket.write(data, 'binary',() => {
                socket.off('error', errorHandler);
                resolve(true); //data sent, resolve the promise
            });
        }
        catch(e){ //nodejs socket.write does not throw exception
            resolve(false);
        }
    })
}

но, есть ли лучшее решение? , потому что я не хочу создавать анонимную функцию и вызывать on('error',) и off('error',) каждый раз, когда вызывается функция send()

1 Ответ

0 голосов
/ 26 октября 2018

Вы можете проверить аргумент error, переданный в socket.write обратном вызове.

        socket.write(data, 'binary',(err) => {
            if (err) return reject err;
            resolve(true); //data sent, resolve the promise
        });

Но рекомендуется прослушивать error событие.

Источник:

Метод writable.write () записывает некоторые данные в поток и вызывает предоставленный обратный вызов после полной обработки данных. Если происходит ошибка, обратный вызов может или не может быть вызван с ошибкой в ​​качестве первого аргумента. Чтобы надежно обнаруживать ошибки записи, добавьте прослушиватель для события error.

- С Writable.write () doc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...