Promise results in Uncaught TypeError: func_get_db_data is not a function

Promise results in Uncaught TypeError: func_get_db_data is not a function

我正在构建一个模拟数据库中 requesting/receiving 数据结构的演示。输出应该只是返回数组的控制台日志。

我收到消息 Uncaught TypeError: func_get_db_data is not a function

我看到了这个问题TypeError: #<Promise> is not a function

但答案对我来说太具体了,无法适用于我的情况。我怎样才能理解这里的解决方案?

let func_get_db_data = 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'}
  ]);
});

const tableData = func_get_db_data().then( (data) => {
  return data;
});

console.log(tableData);

更新

根据以下评论,我尝试了这个(但不太明白......它只是 returns 一个空对象)

let func_get_db_data = () => {
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'}
  ];
};

const getTables = new Promise(func_get_db_data);

getTables.then( (data) => {
  return data;
});

console.log(getTables);

我真正想要的是构建代码,以便像这样的结构 returns 数据:

const tableData = func_get_db_data().then( (data) => {
  return data;
});

您不能将变量初始化为 promise 对象然后调用它,它需要由函数调用才能 return 值。

只需将 promise 包装在一个函数中,然后 return 它。现在您可以调用它并访问 promise 方法。

但是,您尝试检索承诺数据的方式是程序结构的问题。基本上,如果你想维护那种类型的代码结构,你必须使用 async/await 范式——否则,你需要在承诺的 .then() 中工作以开始使用它的数据.

示例:

const func_get_db_data = () => {
  return new Promise((resolve, reject) => {
    return 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'}
    ])
  })
}

async function main() {
  const tableData = await func_get_db_data();
  console.log("tableData: ", tableData);
}

main()

异步函数中的所有内容都将同步处理,因为程序执行只会在 func_get_db_data() 已解析并且 return 为 tableData 赋值后继续执行。

根据您的程序结构,尤其是当您尝试将变量初始化为已解析的 Promise 对象的 return 值时,最好使用 async/await 范例。

如果您想使用 promise 链,那也完全没问题,但是您要基于解析数据执行的所有逻辑都限制在 .then() 中,如下所示:

const func_get_db_data = (query) => {
  return new Promise((resolve, reject) => {
    return 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'}
    ])
  })
}

func_get_db_data()
  .then(resolve => {
    console.log("table data: ", resolve);
    //example data parsing
    const tableData = resolve.slice(0, 1);
    return tableData;
  })
  .then(resolve2 => console.log("resolve2: ", resolve2))
  .catch(err => console.log(err))
  

因此,如果您想将变量初始化为一个承诺值,您应该使用 async/wait 方法,但您也可以使用承诺链接。