【问题标题】:Using async/await to return data in hapi.js's handler function在 hapi.js 的处理函数中使用 async/await 返回数据
【发布时间】:2019-03-31 11:26:05
【问题描述】:

我想从我的处理函数返回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;
}

没有抛出错误,因为登录到控制台会打印出我正在寻找的值。

【问题讨论】:

    标签: node.js typescript async-await hapijs


    【解决方案1】:

    为此,您需要使handler 返回Promise,并在处理程序中,用Promise 包装connection.connect 块。

    例如

    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);
                   });
            });
        });
    }
    

    【讨论】:

    • 谢谢!这行得通。这正是我想要的!
    • 因为您使用return Promise(res,rej)cb 转换为promise,所以您不需要async (request,h) =&gt; { 中的async,因为异步函数返回promise.resolve(yourfunctionreturndata),除非有hapi 中的范围发生了一些奇怪的事情
    【解决方案2】:

    返回时数据未初始化。您可以通过在返回之前添加另一个日志语句来测试它,您会看到它在console.log(dataSet);之前打印

    我不知道connection.connect 返回什么(它是什么框架?),但你可以承诺它。然后你要么返回一个“连接并获取数据”的承诺并让调用者等待它,或者你在你的函数中await它并在承诺完成后返回数据。

    【讨论】:

      猜你喜欢
      • 2021-08-06
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2021-04-11
      • 2019-03-01
      相关资源
      最近更新 更多