Promise报Uncaught TypeError: func_get_db_data is not a function如何解决
问题根源
- 初始代码错误原因:
func_get_db_data被直接赋值为Promise实例,不是可调用的函数,调用func_get_db_data()自然会抛出「不是函数」的错误 - 后续修改版错误原因:
- 传入Promise构造函数的executor函数只有调用
resolve()才会触发状态变更,直接return的数组不会被当作Promise的返回值 - 直接打印Promise实例无法拿到内部数据,异步结果必须在
then回调中或者用await获取
- 传入Promise构造函数的executor函数只有调用
正确实现(完全符合你要求的调用形式)
两种写法都可以满足需求:
写法1:手动返回Promise
let func_get_db_data = () => { return new Promise((resolve, reject) => { resolve([ {name: 'Bob', gender:'m', class:'junior', job: 'Teacher'}, {name: 'Dan', gender:'m', class:'senior', job: 'Detective'}, {name: 'Ann', gender:'f', class:'junior', job: 'Analyst'}, {name: 'Sue', gender:'f', class:'retired', job: 'Accountant'} ]); }); }; // 完全匹配你要求的调用形式,打印操作要放在then回调内才能拿到数据 func_get_db_data().then( (data) => { console.log(data); const tableData = data; // 所有对tableData的后续操作都要放在这个回调作用域内 });
写法2:用async语法简化
// async函数本身默认返回Promise,调用逻辑完全不变 let func_get_db_data = async () => { return [ {name: 'Bob', gender:'m', class:'junior', job: 'Teacher'}, {name: 'Dan', gender:'m', class:'senior', job: 'Detective'}, {name: 'Ann', gender:'f', class:'junior', job: 'Analyst'}, {name: 'Sue', gender:'f', class:'retired', job: 'Accountant'} ]; }; func_get_db_data().then(data => console.log(data));
补充说明
不要试图在同步代码中直接拿到Promise的返回值,JavaScript的异步执行规则决定了同步代码一定会先于异步回调执行,同步阶段打印Promise只能拿到 pending 状态的容器对象,无法获取最终结果。
内容的提问来源于stack exchange,提问作者crashwap
相关产品推荐
相关产品推荐

