Как разорвать цепь в обещании - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь ограничить количество выборок apis в моем проекте, сохраняя их в простом кеше, в коллекции ключей в mongodb. Есть ли способ остановить распространение .then () внутри Promise без использования async / await?

export const getData = (url: string) => {
    return new Promise((resolve, reject) => {
        findInCache(url)
            .then((cached: string | null) => {
                if (cached) {
                    resolve(cached);
                }
            })
            .then(() => {
                axios
                    .get(url)
                    .then(({data}) => {
                        setCache(url, data, TTL);
                        resolve(data);
                    })
                    .catch(e => reject(e));
            });
    });
};

Ответы [ 3 ]

4 голосов
/ 21 марта 2019

Во-первых, давайте избавимся от анти-паттерна конструктора Promise - ваш вызов функции внутри исполнителя обещаний возвращает обещание, поэтому нет необходимости в новом Promise

Во-вторых, второй запрос можно запускать только в том случае, если результат первого пустой

export const getData = (url) => findInCache(url)
// here we return haveResult and avoid axios.get(url) altogether
.then((haveResult) => haveResult || axios.get(url)
    // sometimes nested .then is useful like in this case
    .then(({data}) => {
        setCache(url, data, TTL);
        return data;
    })
);
0 голосов
/ 21 марта 2019

вы можете просто сделать это вместо цепочки. если он находится в кеше, тогда извлекайте из кеша, иначе получите из URL

export const getData = (url: string) => {
    return new Promise((resolve, reject) => {
        findInCache(url)
            .then((cached: string | null) => {
                if (cached) {
                    resolve(cached);
                } else {
                  axios
                    .get(url)
                    .then(({data}) => {
                        setCache(url, data, TTL);
                        resolve(data);
                    })
                    .catch(e => reject(e));
                  }
            })

    });
};
0 голосов
/ 21 марта 2019

Когда вы возвращаете что-то результат в then, этот результат входит в следующую then функцию. Таким образом, вы можете управлять тем, что вы будете делать в следующем then, основываясь на входном параметре inCache. Таким образом, вы можете сделать что-то вроде:

export const getData = (url: string) => {
    return new Promise((resolve, reject) => {
        findInCache(url)
            .then((cached: string | null) => {
                if (cached) {
                    resolve(cached);
                    return true;
                }
                return false;
            })
            .then((inCache) => {
                if (!inCache) {
                  axios
                      .get(url)
                      .then(({data}) => {
                          setCache(url, data, TTL);
                          resolve(data);
                      })
                      .catch(e => reject(e));
               }
            });
    });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...