Return 在 Node.js 中执行作业后承诺

Return Promise after job execution in Node.js

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

作业调度程序(使用 node-schedule 模块)正在一段时间内从 Web 服务检索数据并将内容插入数组(以供进一步处理)。 完成工作后,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);
   });
}

问题是您在回调完成之外解决它。您需要在回调中解决它。

像这样

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);  
           }
       });
   });
}