【问题标题】:promises workflow in angular js, regarding pouchDB承诺 Angular js 中的工作流,关于 pouchDB
【发布时间】:2018-09-02 05:57:54
【问题描述】:

我正在尝试用 Angular js 编写一些代码,这是我的第一次,所以还有一些我不知道的东西。 我也在使用 PouchDB,并按照我想做的逻辑:

  • 检查数据库中是否有一些东西
  • 如果是,将其销毁并创建一个新的
  • 将新内容放入数据库中

这似乎很简单,但我可能迷失在承诺中......

if (stuffInsideDB != undefined && stuffInsideDB !='')
{                       
    db.destroy().then(
        function(result)
        {
            db = new PouchDB('DB');
            db.info();                  
        }
    );
}
db.put(
    {
        _id: (currentIndex + 1).toString(),
        "data": encryptedHex.toString()
    }
).then(
    function() 
    { //do something}
);

执行这段代码,它在销毁之前执行 put(当然我得到了一个错误)。是不是因为我没有做类似 destroy().then(create().then(put())) 的事情?

非常感谢

【问题讨论】:

标签: javascript angularjs database angular-promise pouchdb


【解决方案1】:

对于 AngularJS,将 PouchDB 承诺包装在 $q.when() 中很重要。这将在 PouchDB 承诺解决后通知 AngularJS 更新 UI。

promise 的.then 方法返回一个可用于链接操作的新promise。当chaininig promises 时,重要的是return 值和对处理函数的承诺。

var promise = $q.when();

if (stuffInsideDB != undefined && stuffInsideDB !='')
{                       
    promise = db.destroy().then(
        function(result)
        {
            db = new PouchDB('DB');
            return db.info();                  
        }
    );
}

promise =  promise
 .then(function() {
   //IMPORTANT return the `db.put` promise
   return db.put(
    {
        _id: (currentIndex + 1).toString(),
        "data": encryptedHex.toString()
    }
).then(
    function() 
    { //do something}
);

return $q.when(promise);

第一部分创建一个空的承诺或销毁的承诺。第二部分在此之后链接db.put 操作。最后一部分将 ES6 Promise 转换为与 AngularJS 框架及其摘要循环集成的 AngularJS Promise。

有关详细信息,请参阅AngularJS $q Service Promise API Reference

【讨论】:

    【解决方案2】:

    这个问题可能有多种解决方案。由于您对 Promise 感兴趣,这里有一种方法可以通过 Promise 找到解决方案: 注意:我没有在本地运行这段代码,所以仅供参考。

    您可以创建一个函数来执行您在问题中提到的所有操作并从中返回一个承诺,例如:

    return new Promise(function (resolve, reject) {
        if (stuffInsideDB != undefined && stuffInsideDB !=''){
            resolve(1);
        }else{
            reject();
        }
    
    }).then(function (result) {
        return db.destroy();
    }).then(function (result) {
            db.put(
                { _id: (currentIndex + 1).toString()
                    ,"data": encryptedHex.toString()
                });
    }).then(function (result) {
       //do something
    });
    

    【讨论】:

    • 它回答你的问题了吗?
    猜你喜欢
    • 2017-01-30
    • 2014-07-07
    • 2017-04-03
    • 2014-02-02
    • 2016-06-21
    • 2015-11-27
    • 2017-01-12
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多