node.js - Node.js 中作业执行后返回 Promise

标签 node.js promise async-await node-schedule

我正在创建一个小型 Node.js 应用程序来进行一些监控。必须使用此应用程序进行以下操作:

作业调度程序(使用node-schedule模块)在一段时间内从Web服务检索数据并将内容插入到数组中(用于进一步处理)。 完成工作后, promise 应该解析完整的数组,以便在我的主程序中使用它。

这是到目前为止我的编码。通过此编码, promise 在完成工作之前得到解决,并且数组为空。你能给我一些如何解决这个问题的提示吗?

async function dataRetrieval(start, end, rule){
   let array = [];
   return new Promise(function (resolve) {
       schedule.scheduleJob({start: start, end: end, rule: rule}, async function (){
           let data = await service.getData();
           array.push(data);
       });
       resolve(array);
   });
}

最佳答案

发生这种情况是因为 scheduleJob 是一个异步函数,并且您的 resolve 调用是在作业完成之前在回调之外进行的。

您可以使用从 scheduleJob 传递给回调的 fireDate 值来检查当前执行是否是最后一次。如果是这样,只有这样,您才能使用回调中的最终数据调用 resolve:

async function dataRetrieval(start, end, rule){
   let array = [];
   return new Promise(function (resolve) {
       schedule.scheduleJob({start: start, end: end, rule: rule}, async function (fireDate) {
           let data = await service.getData();
           array.push(data);

           if (fireDate >= end) {
               resolve(array);  
           }
       });
   });
}

关于node.js - Node.js 中作业执行后返回 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60307587/

相关文章:

json - 在 bash 中使用 jq 查找并合并所有 package.json 文件?

c# - 调用包含来自 MVC Controller 的异步调用的服务的正确模式

javascript - 异步函数与javascript中的类

sql - 如何重复 SQL 插入直到 pg-promise 成功?

c# - 如何根据条件等待任务?

lua 的 Node.js?

javascript - 如何在 TypeScript 中修复 "Initializer provides no value for this binding element and the binding element has no default value"?

javascript - 无法使用 Cheerio 获取 iframe

javascript - Promise.defer 的正确模式是什么?

node.js - 被拒绝的 promise 没有达到目标