我有一个async
函数来检查订单的状态(checkOrderStatus()
)。我想重复此函数,直到它返回 "FILLED"
或 "CANCELED"
,然后在另一个函数中使用此返回值来决定继续或停止代码。每个订单在"FILLED"
或"CANCELED"
之前都会经历不同的状态,因此需要重复checkOrderStatus()
函数(它是API 调用)。
我现在所拥有的是这个,重复 checkOrderStatus()
函数:
const watch = filter => {
return new Promise(callback => {
const interval = setInterval(async () => {
if (!(await filter())) return;
clearInterval(interval);
callback();
}, 1000);
});
};
const watchFill = (asset, orderId) => {
return watch(async () => {
const { status } = await checkOrderStatus(asset, orderId);
console.log(`Order status: ${status}`);
if (status === 'CANCELED') return false;
return status === 'FILLED';
});
};
然后,我从另一个函数调用 watchFill()
,我想在其中检查其返回值(true
或 false
)并继续如果 true
则执行代码,如果 false
则停止代码:
const sellOrder = async (asset, orderId) => {
try {
const orderIsFilled = await watchFill(asset, orderId);
if (orderIsFilled) {
//… Continue the code (status === 'FILLED'), calling other async functions …
}
else {
//… Stop the code
return false;
}
}
catch (err) {
console.error('Err sellIfFilled() :', err);
}
};
但是,这不起作用。我可以通过 watchFill()
中的 console.log
在终端中看到状态的更新,但它永远不会停止,最重要的是,orderIsFilled 中的值无论
变量都不会更新。watchFill()
返回的值变成什么,sellOrder()
中的
如何实现所需的行为?
最佳答案
watch
永远不会使用任何值调用 resolve
(在原始代码中,这被错误地命名为 callback()
),所以没有办法const orderIsFilled = wait watchFill(asset, orderId);
将使用除 undefined
之外的任何内容填充 orderIsFilled
。
如果将 await filter()
的结果保存在变量中并将其传递给
callback
作为 callback(result)
,您的代码看起来应该可以工作。
也就是说,可以通过使用循环并编写简单的 wait
函数来简化代码。这样,您可以返回一个值(比弄清楚如何/何时调用 resolve
更自然),使 new Promise
模式远离逻辑并避免处理 setInterval
以及随之而来的簿记。
const wait = ms =>
new Promise(resolve => setTimeout(resolve, ms))
;
const watch = async (predicate, ms) => {
for (;; await wait(ms)) {
const result = await predicate();
if (result) {
return result;
}
}
};
/* mock the API for demonstration purposes */
const checkOrderStatus = (() => {
let calls = 0;
return async () => ({
status: ++calls === 3 ? "FILLED" : false
});
})();
const watchFill = (asset, orderId) =>
watch(async () => {
const {status} = await checkOrderStatus();
console.log(`Order status: ${status}`);
return status === "CANCELLED" ? false : status === "FILLED";
}, 1000)
;
const sellOrder = async () => {
try {
const orderIsFilled = await watchFill();
console.log("orderIsFilled:", orderIsFilled);
}
catch (err) {
console.error('Err sellIfFilled() :', err);
}
};
sellOrder();
关于javascript - 重复异步函数直到 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66837523/