如何打破承诺链

时间:2019-03-21 09:04:57

标签: javascript express asynchronous es6-promise

我试图通过将它们保存在mongodb中的简单缓存(键集合)中来限制我的项目中的api获取次数。是Thera的方法,无需使用async / await来阻止.then()在Promise中的传播?

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 个答案:

答案 0 :(得分:4)

首先,让我们摆脱Promise构造函数的反模式-在promise executor中的函数调用将返回一个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;
    })
);

答案 1 :(得分:0)

当您在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));
               }
            });
    });
};

答案 2 :(得分:0)

您可以执行此操作,而不是链接。如果它在缓存中,则从缓存中获取,否则从网址中获取

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));
                  }
            })

    });
};