2

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

作业调度程序(使用节点调度模块)在一段时间内从 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);
   });
}
4

2 回答 2

2

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

像这样的东西

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);
        });
    });
 }
于 2020-02-19T19:42:01.950 回答
2

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

您可以使用fireDate传递给回调的值scheduleJob来检查当前执行是否是最后一个。如果是这样,那么只有这样,您才能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);  
           }
       });
   });
}
于 2020-02-19T19:43:33.587 回答