javascript - 重复异步函数直到 true

标签 javascript node.js async-await promise

我有一个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(),我想在其中检查其返回值(truefalse)并继续如果 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/

相关文章:

c# - NodeJS 的非无状态 Socket 解决方案

storage - Nodejs 内存存储

javascript - AJAX 长轮询不从浏览器发送

javascript - 在javascript中获取没有0索引的日期时间

javascript - 可以在 RequireJS 模块中使用 'this' 关键字吗?

node.js - npm install karma 脚本启动器错误

firebase - async/await 与 firebase .on() 数据库监听器

c# - 我可以等待我用生成器创建的可枚举吗?

c# - 如何以线程安全的方式使用多线程的 async/await 异步写入文件流

javascript - jQuery .closest() 方法在 iOS 设备上返回未定义