当Promise收到查询错误时访问IndexDB

时间:2018-01-02 11:59:17

标签: javascript reactjs indexeddb

我正在进行渐进式Web应用程序,当ajax响应失败时,我想访问存储在IndexedDB上的数据。查询成功后,数据将被填充。以下是其中一项尝试。在注释中是我插入离线部分之前的原始格式(我已经有基本代码)。

getAudits: (startOfMonth, endOfMonth) => {
return new Promise((resolve, reject) => {
  request
    .get(url + "api/?method=Audit.data")
    .query({
      pageLength: "all",
      format: "json",
      where: startOfMonth
        ? Utils.hashQuery(
            "a.date",
            "between",
            [startOfMonth, endOfMonth].toString()
          )
        : "",
      ts: new Date().getTime()
    })
    .end((error, response) => {
        var res;
      if (error) {
          res = getCacheAudits(startOfMonth, endOfMonth);
        //reject(error);
      } else {
        let _audits = [];
        const audits = Utils.toArray(JSON.parse(response.text).rows);
        audits.forEach(audit => {
          _audits.push(audit);
          //console.log(audit);

        });
        res = _audits;
        getServerAudits(_audits);
        //resolve(res);
      }
      resolve(res);
    });
});
  }

有没有人知道如何正确处理这个问题?提前谢谢。

3 个答案:

答案 0 :(得分:0)

不确定为什么要将Utils.toArray(JSON.parse(response.text).rows复制到审核,_audits和res,它们都是相同的。

也不确定getServerAudits应该做什么,因为它没有返回任何内容而你没有做任何事情的返回值(通常是一个糟糕的设计标志来调用函数并忽略它们的返回)

你可能会这样做:

getAudits: (startOfMonth, endOfMonth) => {
  return new Promise((resolve, reject) => {
    request
      .get(url + "api/?method=Audit.data")
      .query({
        pageLength: "all",
        format: "json",
        where: startOfMonth
          ? Utils.hashQuery(
              "a.date",
              "between",
              [startOfMonth, endOfMonth].toString()
            )
          : "",
        ts: new Date().getTime()
      })
      .end((error, response) =>
          (error)
            ? reject([error,startOfMonth, endOfMonth])
            : resolve(Utils.toArray(JSON.parse(response.text).rows))
      )
    })
    .catch(
      ([err,startOfMonth, endOfMonth]) =>
        getCacheAudits(startOfMonth, endOfMonth)
    )
    .then(
      audits => {
        //not sure what this does, you don't seem to care about it's
        //  result because your code doesn't do anything with it
        getServerAudits(audits);
        //probably want to save audits to local storage here
        return Promise.all([
          audits,
          saveCacheAudits(startOfMonth,endOfMonth,audits)
        ]);
      }
    )
    .then(
      //resolve audits
      ([audits])=>audits
    )
}

答案 1 :(得分:0)

让我们轻松使用indexedb库jsstore -

var con= new JsStore.Instance(<db_name>);

getCacheAudits: (startOfMonth, endOfMonth)=>{
    return con.select({
    From: "Table_Name",
    Where:
        {
            startOfMonth:startOfMonth,
            endOfMonth: endOfMonth
        }
    })
}

getAudits: (startOfMonth, endOfMonth) => {
    return new Promise((resolve, reject) => {
    request
        .get(url + "api/?method=Audit.data")
        .query({
        pageLength: "all",
        format: "json",
        where: startOfMonth
            ? Utils.hashQuery(
                "a.date",
                "between",
                [startOfMonth, endOfMonth].toString()
            )
            : "",
        ts: new Date().getTime()
        })
        .end((error, response) => {
            var res;
            if (error) {
                //get the data from indexeddb
                getCacheAudits.
                then(function (results){
                    resolve(results);
                })
                .catch(function (error) {
                    reject(error._message);
                }); 
            } else {
                let _audits = [];
                const audits = Utils.toArray(JSON.parse(response.text).rows);
                audits.forEach(audit => {
                _audits.push(audit);
                //console.log(audit);

                });
                res = _audits;
                getServerAudits(_audits);
                resolve(res);
            }
        //resolve(res);
        });
    });
}

您还可以使用where(http://jsstore.net/tutorial/where)和所有其他选项来查询数据。

如果您使用角度来创建应用,请查看此文章 - http://ujjwalguptaofficial.blogspot.in/2017/10/angular4-crud-operation-in-indexeddb.html

希望这会对你有所帮助。

答案 2 :(得分:0)

刚刚解决了问题。它实际上只是在这部分中,但也在getCacheAudits函数中。

getCacheAudits调用变为:

getCacheAudits(startOfMonth, endOfMonth, function (res) {
                        resolve(res);
                    })

并在getCacheAudits函数中添加了一个回调

function getCacheAudits(startOfMonth, endOfMonth, callback){
let initOpenReq = indexedDB.open("AuditsDB");
let agregate = [];
initOpenReq.onsuccess = function() {
    var db = initOpenReq.result;
    var transaction = db.transaction("audits","readonly");
    var obj_store   = transaction.objectStore("audits");

    obj_store.openCursor().onsuccess = function (event){
        let cursor = event.target.result;
        if(cursor){
            agregate.push(cursor.value);
            cursor.continue();
        }else{
            callback(agregate);
        }
    };
}

在功能中还有一些口哨声,但这使它正常工作。

很抱歉从一开始就不包括该功能。