Возврат обещания после выполнения задания в Node.js - PullRequest
1 голос
/ 19 февраля 2020

Я создаю небольшое Node.js приложение для некоторых задач мониторинга. С этим приложением необходимо выполнить следующую операцию:

Планировщик заданий (с использованием модуля node-schedule ) извлекает данные из веб-службы в течение определенного периода времени и вставляет содержимое в массив (для дальнейшей обработки). После завершения задания обещание должно разрешить весь массив, чтобы использовать его в моей основной программе.

Вот мое кодирование до сих пор. С помощью этой кодировки обещание разрешается до завершения задания, и массив становится пустым. Можете ли вы дать мне какие-либо советы, как решить эту проблему?

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

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Это происходит потому, что 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);  
           }
       });
   });
}
1 голос
/ 19 февраля 2020

Проблема в том, что вы решаете это за пределами завершения обратного вызова. Вам нужно разрешить его внутри обратного вызова.

Как-то так

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);
        });
    });
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...