承诺 setTimeout
Promise with setTimeout
我想重写此函数来解析 promise 而不是调用回调函数,以试图更好地理解如何使用 promise。
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();
})
// ...
});
但是当建立连接时,这并没有正确解决。
我做错了什么?我如何重写它以正确使用和解析 Promise 而不是使用回调函数?
根据评论,我能够重构该函数以正确地 return 仅在建立连接时才解析的承诺:
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);
});
};
我想重写此函数来解析 promise 而不是调用回调函数,以试图更好地理解如何使用 promise。
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();
})
// ...
});
但是当建立连接时,这并没有正确解决。
我做错了什么?我如何重写它以正确使用和解析 Promise 而不是使用回调函数?
根据评论,我能够重构该函数以正确地 return 仅在建立连接时才解析的承诺:
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);
});
};