【问题标题】:Awaiting functions in parameter参数中的等待函数
【发布时间】:2021-10-15 01:45:39
【问题描述】:

我想等待从内置谷歌API调用中传入参数的函数调用,并在参数函数执行后返回结果。 但我无法继续下去。

async function list(auth, userId) {
    const gmail = google.gmail({ version: 'v1', auth });
    const result;
    await gmail.users.messages.list({
        userId: userId,
    }, async (err, res) => {
        if (err) return console.log('The API returned an error: ' + err);
        console.log(res.data);
        result = await res.data;  // I want to await this part
    });

    return result;
}
...

const returnedResult = await list(auth, id);
console.log(returnedResult); 

在上面的代码中发生的事情是'result'和'returnResult'保持未定义并且首先被输出,然后res.data被记录到控制台中。 任何帮助,将不胜感激。 提前致谢


编辑:

尽管有解决方法来等待下面回答的此类呼叫。但它仍然没有回答在发出 API 请求时它获得两种形式的内部机制,即 如何

gmail.users.messages.list({...}, (err, res){...});

可以在内部转换为

let result = await gmail.users.messages.list({});

反之亦然。 一种可能的解释似乎是方法重载。但即使是这个概念也不能解释它,因为这两个调用具有完全相同的功能。 对于第一个实现,因为它也是一个涉及承诺的调用,它仍然应该有一些机制来等待请求。

【问题讨论】:

    标签: node.js authentication async-await google-oauth serverside-javascript


    【解决方案1】:

    关于以下几点:

    结果 = 等待 res.data; // 我想等待这部分

    等待非承诺值无助于解决您的问题。假设gmail.users.messages.list(...) 返回一个承诺,而不是在onFulfilled function 中设置结果,试试这个:

    async function list(auth, userId) {
      // ...
    
      let result;
      try {
        result = await gmail.users.messages.list({ userId: userId });
      } catch (ex) {
        console.error('The API returned an error', ex)
      }
    
      return result;
    }
    

    【讨论】:

    • 感谢您的回复。我在考虑的时候也是这么想的
    【解决方案2】:

    虽然这不是如何等待参数中的函数的确切答案,但解决这种情况的方法。 在我的情况下替换

    await gmail.users.messages.list({...}, (err, res) => {...});
    

    try{
       const res = await gmail.users.messages.list({user: userId});
       console.log(res.data);
       return res.data
    } catch(err) {
       return console.log('The API returned an error: ' + err);
    }
    

    【讨论】:

    • > it's not the exact answer of how to await the functions in parameter。你希望它的工作方式不是承诺在 Javascript 中的工作方式
    • 如果一个函数被声明/定义为返回一个承诺,它可以被等待。所以我希望它的工作方式是合理的。问题是该函数本身是否存在于参数中,promise 会发生什么以及它在内部如何表现。
    猜你喜欢
    • 2019-03-10
    • 1970-01-01
    • 2021-06-28
    • 2021-09-23
    • 2019-12-12
    • 2023-03-13
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    相关资源
    最近更新 更多