Как ждать выполнения функции и получить правильный ответ на обещание? - PullRequest
0 голосов
/ 14 октября 2019

Я создаю веб-сайт, используя Johnny-five, React и node.js для управления моей платой Arduino, но я застрял при обработке функции async / await. Итак, пользователь отправляет выбранный порт (COM1), например, на сервер, затем сервер создает новый экземпляр платы

async function checkPortConnection(port) {
    let board = new five.Board({port: port});
    let success;

    await board.on('error', () => {
        success = false;
    });

    await board.on('ready', () => {
        success = true;
    });

    return success;
}

Я думал, что ключевое слово await остановит выполнение функции и будет ждать ответа платы, который занимает около7 секунд, но когда я делаю это:

checkPortConnection(port).then((data)=>{
            console.log(data);
        });

Я получаю 'undefined' (потому что я получаю success, который не определен?) И после этого сервер отправит ответ, если выбран портправильно или нет. Но мой вопрос, как получить правильный ответ от функции checkPortConnection()?

1 Ответ

4 голосов
/ 14 октября 2019

Я думаю, проблема в том, что вы слушаете события, но это само по себе не является Обещанием. Кроме того, если бы они были, и вы использовали бы await, вы бы никогда не достигли кода, чтобы зарегистрировать событие ready. Следующее должно решить эту проблему:

async function checkPortConnection(port) {
    
    return new Promise((resolve, reject) => {
    
      let board = new five.Board({port: port});

      board.on('error', error => resolve( false ));
      board.on('ready', event => resolve( true ));
    
    });
    
}

Лично я бы также сделал следующее, так как Обещание будет использовать then или catch позже, так что вы можете вообще игнорировать логический бит:

board.on('error', reject);
board.on('ready', resolve);
...