了解函数 returns 和回调

Understanding function returns and callbacks

我的函数顺序有问题,我不确定为什么。

当鼠标悬停在第一个函数中对 function_2 的调用时,VSCode 给出了 Promise<void> 的结果,当 [=38] 时控制台输出 undefined =](甚至在 function_2() 完成之前)。

由于我在 VSCode 中编辑,当我将鼠标悬停在 return 上时,它会在顶部告诉我它用于 request 回调,所以我有一个通用的问题是什么的想法。过去我不知道,这很可能是由于我对 returns 承诺缺乏理解 and/or 脚本中事情发生的真实顺序。

我的代码中的其他所有内容都没有问题。

我对此进行了相当广泛的研究,但运气不佳(在本网站和一些通用代码文档中),但如果我遗漏了什么,请告诉我。

我在下面列出了我的函数的一般顺序,以及 return 调用的位置。

async function_1() {
const check = await function_2();
return console.log(check);
}
async function_2() {
...
    if(...){
    ...
        request(... => {
            ...
            while(...) {
                if(...) {
                ...
                return 'result'; //<<<RETURN
                }
                await  msg.channel.awaitMessages({
                ...
                }).then((c) => {
                    if() {
                    ...
                        if() {
                        ...
                        return 'result'; //<<<RETURN
                        };
                    } else if {
                    ...
                    return 'result'; //<<<RETURN
                    } else {
                    
                    };
                }).catch((c) => {
                ...
                return 'result'; //<<<RETURN
                });
            }; //<<<end 'while'
        }); //<<<end 'request'
    }; //<<<end 'if'
};

如果我的解释不清楚,或者需要更多代码,请告诉我。

VSCode 能够分析您的代码并得出结论,它总是 returns Promise<void> a void return 与此上下文中的未定义相同。

首先,Promise<T> 总是从 async 函数中 return 编辑。

其次,在对 request(... => { 的调用中,您提供了一个 回调 ,此 回调 [=] 的 return 值32=] 被 request 使用,而不是 function_2.

这意味着您的回调中的 return 永远不会 return function_2 的任何值。

如果您想 return 来自父 function_2 的值,您可以像这样解析自定义 Promise

function function_2() { // note: not async because we already return a Promise
  return new Promise((resolve, reject) => {
    request(() => {
      /* ... */
      resolve("some value"); // effectively returns a value to the Promise
      if (error) {
        reject(error); // throw an error
      }
      /* ... */
    });

  });
}

try {
  const value = await function_2();
  console.log(value); // "some value"
} catch(e) {
  console.error(e);
}