了解函数 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);
}
我的函数顺序有问题,我不确定为什么。
当鼠标悬停在第一个函数中对 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);
}