Использование async / await для возврата данных в функцию-обработчик hapi.js - PullRequest
0 голосов
/ 26 октября 2018

Я хочу вернуть dataSet из моей функции обработчика. Однако это вложено в мою цепочку обещаний. Я пытаюсь использовать await/async, но значение данных все еще не определено. Мысли о том, как это сделать?

handler: (request, h) => {

    let data: any;
    connection.connect((err) => {
        if (err) {
            console.error("Error-------> " + err);
        }
        console.log("Connected as id " + connection.threadId);
        connector.getAllEvents()
            .then(async dataSet => {
                console.log(dataSet);
                data = await dataSet;
            });
    });
    return data;
}

Ошибка не генерируется, поскольку при входе в консоль выводятся значения, которые я ищу.

Ответы [ 2 ]

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

Данные не инициализируются при возврате.Вы можете проверить это, добавив еще один оператор журнала непосредственно перед возвратом, вы увидите, что он печатается до console.log(dataSet);

Я не знаю, что connection.connect возвращает (какие это фреймворки?), Но вы можетеобещай это.Затем вы либо возвращаете обещание «подключиться и получать данные» и позволяете вызывающему абоненту ждать его, либо вы await выполняете его внутри своей функции и возвращаете данные после выполнения обещания.

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

Для этого вам нужно заставить handler вернуть Promise, а в обработчике обернуть блок connection.connect Promise.

, например

handler: (request, h) => {
    // wrap connector.connect(...) in a Promise
    return Promise<any>((resolve, reject) => {
        connection.connect(err => {
           if (err) {
               console.error("Error -----> ", err);

               // error in connection, propagate error via reject
               // and do not continue processing
               return reject(err);
           }

           console.log("Connected as id " + connection.threadId);
           connector.getAllEvents()
               // don't think you need this to be async
               // as connector.getAllEvents() will should return a Promise<T>
               // and .then() is like a .map() so its first argument is a T
               // rather than a Promise<T> 
               .then(dataSet => {
                   console.log(dataSet);

                   // we finally have our value
                   // so we propagate it via resolve()
                   resolve(dataSet);
               });
        });
    });
}
...