与 IndexedDB 一起使用所需的异步等待

问题描述 投票:0回答:1

我有一个react typescript应用程序,在我的应用程序中我使用IndexedDB来存储一些数据。 我有单独的类用于使用 IndexedDB 调用 DB 。在我的一个类方法中,我使用此代码来获取所有数据

 public async getAll(){

 const promise = await new Promise((resolve,reject)=>{
    const req = this.openDB();
    req.addEventListener("error", (e) => {
      console.log("error ", e);
      reject ("error");
    });

    req.addEventListener("success", () => {
      const db = req.result;
      const tx = db.transaction("tasks", "readonly");
      tx.addEventListener("complete", () => {
        console.log("transaction complete");
        db.close();
      });

      const readObj = tx.objectStore("tasks");
      const data = readObj.getAll();
      
      data.addEventListener("success",(e)=>{
        console.log(data);
        console.log(e);
        resolve (data.result);
      });

    });
 });

 return await promise;

} 

在我的一个组件事件处理程序中

      const db = new DB();
      const dataPro = db.getAll();
      dataPro.then((resData)=>{
      console.log(resData); // I have Data I need it
                           }

但是 getAll func 工作正常 without async-await ,所以我的问题是:真的有必要在 getAll func 中使用 async-await 吗?我的意思是有什么情况我需要async-await

我尝试 getAll func code without async-await 它对我来说效果很好

javascript typescript async-await promise
1个回答
0
投票

async
await
关键字本质上是“语法糖”,用于以更简洁的方式使用
Promises
。它们不是“必需的”,但通常很有用。然而,如果函数所做的只是创建并返回一个 Promise 那么它们就没什么用处了。
显示的用法甚至已经是多余的。您正在等待相同的 

Promise

两次。到达这里后:

const promise = await new Promise((resolve,reject)=>{

一旦来到这里:

return await promise;

并且由于该函数是
async

,因此在调用它时仍然需要等待(或跟随回调):

dataPro.then((resData)=>{

正如您所观察到的,这都是非常多余和不必要的。如果函数本身在内部没有 
await

任何东西,那么它就不需要是

async
。它可以只返回创建的
Promise
:
public getAll(){
  return new Promise((resolve,reject)=>{
    // the rest of the code in the Promise
  });
}

并且该功能的用法不会改变。

© www.soinside.com 2019 - 2024. All rights reserved.