代码之家  ›  专栏  ›  技术社区  ›  F.P

承诺设置超时

  •  0
  • F.P  · 技术社区  · 5 年前

    我想重写这个函数来解析承诺,而不是调用回调函数,以更好地理解使用承诺。

    export const connect = (callback: CallableFunction|void): void => {
        LOG.debug("Connecting to DB at %s", URI);
    
        connectToMongoDb(URI, opts)
            .then((result) => {
                LOG.debug("Connection established");
                connection = result;
    
                if (callback) {
                    callback();
                }
            })
            .catch((err) => {
                LOG.error("Could not establish connection to %s, retrying...", URI);
                LOG.error(err);
                setTimeout(() => connect(callback), 5000);
            });
    };
    

    然而,我似乎无法做到。我已经尝试过这种天真的做法了

    export const connect = (): Promise<void> => new Promise((resolve): void => {
        // ...´
            .then((result) => {
                LOG.debug("Connection established");
                connection = result;
                resolve();
            })
        // ...
    });
    

    但当建立连接时,这并不能正确解决。

    我做错了什么?我如何重写它以正确使用和解析承诺,而不是使用回调函数?

    0 回复  |  直到 5 年前
        1
  •  1
  •   F.P    5 年前

    根据这些评论,我能够重构函数,以正确返回仅在建立连接时才解析的承诺:

    const delay = (ms: number): Promise<void> =>
        new Promise((resolve): void => {
            setTimeout(resolve, ms);
        });
    
    export const connect = (): Promise<void> => {
        LOG.info("Connecting to DB at %s", URI);
    
        return connectToMongoDb(URI, opts)
            .then((result) => {
                LOG.info("Connection to DB established");
                connection = result;
            })
            .catch((err) => {
                LOG.error("Could not establish connection to %s, retrying...", URI);
                LOG.error(err);
                return delay(5000).then(connect);
            });
    };