запустить функцию после разрешения вложенного обещания - PullRequest
0 голосов
/ 06 мая 2018

У меня есть служебная функция, которая проверяет элементы в 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(() решает 1-е обещание, а не вложенное.

так, как я могу продолжить цепочку после вложенного 2nd обещания?

1 Ответ

0 голосов
/ 06 мая 2018

Вам нужно использовать 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);         
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...