代码之家  ›  专栏  ›  技术社区  ›  ctf0

解析嵌套承诺后运行函数

  •  0
  • ctf0  · 技术社区  · 6 年前

    我有一个实用函数,用于检查indexeddb中的项目并使其无效

    invalidateCache() {
        let now = Date.now()
    
        return keys(cacheStore).then((keys) => { // 1st
            keys.map((key) => {
                return this.getCachedResponse(key).then((item) => { // 2nd
                    if (item.expire < now) {
                        this.deleteCache(key)
                    }
                })
            })
        }).catch((err) => {
            console.error(err)
        })
    }
    

    现在,我需要确保第二个承诺已经解决,然后才能链接到另一个函数,就像这样

    this.invalidateCache().then(() => { // 2nd promise has finished its work
        // check the db
        this.getCachedResponse()
            .then((res) => {
                if (res) {} // item is not expired
                else {} // make http request
    

    但不幸的是 this.invalidateCache().then(() 解析为第一个承诺,而不是嵌套的。

    那么,如何在嵌套 2nd 许诺

    1 回复  |  直到 6 年前
        1
  •  1
  •   ctf0    6 年前

    您需要使用 Promise.all 等待所有承诺:

     return keys(cacheStore).then((keys) => { // 1st
        return Promise.all(keys.map((key) => {
            return this.getCachedResponse(key).then((item) => { // 2nd
                if (item.expire < now) {
                   return this.deleteCache(key)
                }
            })
        }));
    })
    

    使用 async / await :

     async invalidateCache() {
       const now = Date.now()
    
       const keys = await getKeys(cacheStore);
    
       await Promise.all(keys.map(key => this.expireKey(now, key)));
     }
    
     async expireKey(time, key) {
         const item = await this.getCachedResponse(key);
         if(item.expire < time) 
            this.deleteCache(key);         
     }