
在javascript中,任何被声明为async的函数,其返回值都将是一个promise。这意味着,即使你在async函数内部显式地return了一个非promise值,该值也会被自动包装成一个已解决(resolved)的promise。
考虑以下代码结构:
async function getData() {
// ... 异步操作,例如fetch请求 ...
const myObject = {
methodA: () => console.log('Method A called'),
methodB: () => console.log('Method B called')
};
return myObject; // 实际上返回的是 Promise.resolve(myObject)
}当你调用getData()时,你立即得到的是一个Promise,而不是myObject本身。因此,如果你尝试像同步函数那样直接访问其方法,例如getData().methodA(),就会出错。
错误示例:
在HTML中,一个常见的错误用法是在事件处理器中直接调用:
立即学习“Java免费学习笔记(深入)”;
<button onclick="getData().isCorrect()">Submit</button>
这里,getData()返回的是一个Promise。你尝试在Promise对象上调用isCorrect()方法,而Promise对象本身并没有名为isCorrect的方法。因此,JavaScript会报告getData(...).isCorrect为undefined,当你尝试调用它时,就会抛出“is not a function”的错误。
要正确访问async函数返回的Promise所解析出的值(即我们期望的包含方法的对象),你需要使用Promise的.then()方法。.then()方法接收一个回调函数,该回调函数会在Promise成功解决(resolved)时被执行,并将Promise的解析值作为参数传递给它。
正确处理方式:
将HTML中的按钮点击事件修改为:
<button onclick="getData().then(obj => obj.isCorrect())">Submit</button>
代码解析:
为了更好地理解,我们结合原始问题中的Wordle游戏代码片段,展示修改前后的对比。
原始(错误)的JavaScript getData 函数:
async function getData() {
var response = await fetch("https://all-wordle-words.kobyk1.repl.co/script.js");
var data = await response.json();
// ... 省略其他逻辑 ...
function isCorrect() {
// ... 游戏验证逻辑 ...
}
// ... 省略其他辅助函数 ...
return { // 返回一个包含方法的对象
check,
isCorrect,
colorResult
}
}原始(错误)的HTML调用:
<button onclick="getData().isCorrect()">Submit</button>
修改后的HTML调用(推荐):
<button onclick="getData().then(obj => obj.isCorrect())">Submit</button>
注意事项:
<button onclick="getData().then(obj => obj.isCorrect()).catch(error => console.error('Error:', error))">Submit</button>async函数是现代JavaScript中处理异步操作的基石。理解它们总是返回Promise的特性至关重要。当需要访问async函数内部返回的对象及其方法时,务必使用.then()方法来等待Promise解析,从而获取到真正的对象实例,避免“is not a function”的错误。正确地处理Promise,是编写健壮和高效JavaScript异步代码的关键。
以上就是JavaScript异步函数返回值:Promise与对象方法的正确调用姿势的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号