循环中的Promise:TypeScript + Angular + IndexedDB

时间:2015-06-23 17:15:14

标签: javascript angularjs typescript indexeddb angular-promise

我正在开发一种数据同步服务,该服务从Web服务中提取数据,然后将其存储在IndexedDB中。

我在TypeScript Angular Service中做了类似的事情:

this.http
    .post(postUrl, postData)
    .success((data: any, status, headers, config) => {

         console.log("post success");
         console.log("results:");
         console.log(data);

         var records = data.Records;
         var promiseStack = [];

         for (var i = 0; i < records.length; i++) {

             var element = records[i];
             var key = this.dataService.getKeyFromElement(objectStoreConfig, element);

             console.log("key: " + key);

             this.dataService.keyExists(objectStoreConfig, key).then((update) => {

                 if(update){
                     // TODO: put
                     promiseStack.push(true);
                 } else {
                     console.log("using dataService to add to objectStore...");
                     console.log("adding: " + key);
                     this.dataService.add(element, objectStoreConfig).then((result) => {
                         promiseStack.push(result);
                     });
                 }
             });

         }

         this.q.all(promiseStack).then((result) => {
             console.log("done adding/updating all.");
             deferred.resolve(result);
         });
    })
    .error((data, status, headers, config) => {
    });

我在控制台中收到post success,以及我预期的每个返回的record key。问题在于对DataService的异步调用。 this.dataService.add函数实际上是创建事务并将记录添加到IndexedDb。

我的控制台中的输出(以及IndexedDB的状态 - 只有一条记录的密钥为188)表示此代码示例调用add我的DataService上的records中的最后一个元素的功能。

控制台输出:

post success
results:
Object
key: 78 
key: 194
key: 188
done adding/updating all. 
using dataService to add to objectStore...
adding: 188
using dataService to add to objectStore...
adding: 188
using dataService to add to objectStore...
adding: 188  

如何以不同的方式构造我的代码以使for循环&#34;等待&#34;对于要完成的每个异步调用?

1 个答案:

答案 0 :(得分:3)

方法1(仅在您定位ES6时有效)

如果您使用的是TypeScript 1.5,则可以使用let代替var来声明元素和关键变量:

let element = records[i];
let key = this.dataService.getKeyFromElement(objectStoreConfig, element);

问题是elementkey在函数的范围内而不是for循环,因此每次for循环迭代它只是替换element和{{1}变量而不是创建新变量。如果使用key,那么变量将在for循环的范围内。

有关详细信息,请参阅What's-new-in-TypeScript

方法2

或者您也可以使用Array.forEach而不是for循环,因为这也可以修复范围问题:

let