Добавить новую функцию во время выполнения обещания в узле - PullRequest
1 голос
/ 28 апреля 2019

Я не уверен в этом вопросе, можно ли это реализовать или нет.

Я использую node.js с express.js и базой данных MySQL.

У меня есть несколько записей вБаза данных MySQL.Эти записи продолжаются, обновление продолжается.

Итак, предположим, что я получаю некоторые записи из MySQL и запускаю операции над каждой записью с Promise.all, используя функцию demoFunction, которая возвращает обещание.

В этой функцииЯ пытаюсь проверить наличие новых записей в базе данных MySQL.Если я получаю новые записи, я хочу перенести операцию этой новой записи в текущую очередь Promise.all.Это возможно?Если это невозможно, то как мне достичь этой цели с помощью продолжения выполнения?

Итак, мой код выглядит так:

const demoFunction = (arg1, arg2) => {
    checkForNewData();

    return new Promise((resolve, reject) => {
        // Rest of my code is here for this function
        // This function will be take around 5 to 10 mins    
    });
};

const dataFromDatabase = "Here i'm getting some data into array of object from SQL database";

let allPromises = dataFromDatabase.map((obj) => demoFunction(obj.arg1, obj.arg1));

const checkForNewData = () => {
    const newDataFromDatabase = "Here i'm getting some new data into array of object from SQL database";

    for (let i = 0; i < newDataFromDatabase.length; i++) {
        allPromises.push(demoFunction(newDataFromDatabase[i].arg1, newDataFromDatabase[i].arg2));
    }
};

return Promise.all(allPromises)
    .then(() => {
        // response
    })
    .catch((e) => {
        console.log(e);
    })

1 Ответ

0 голосов
/ 28 апреля 2019

В этой функции я пытаюсь проверить наличие новых записей в базе данных MySQL.Если я получаю новые записи, я хочу перенести операцию этой новой записи в текущую очередь Promise.all.Это возможно?

Нет, Promise.all принимает конечное и заданное количество обещаний и ожидает выполнения всех из них.

Если это невозможно, то как мне достичь этой цели?с продолжением выполнения?

Что ж, обещание - это просто значение - если у вас есть обещание чего-то, выполнение уже началось где-то еще.Вы всегда можете выполнить секунду .all, но что произойдет, если записи были добавлены за это время?

Это хорошо сделать:

Promise.all(allPromises).then(() => Promise.all(allPromises)).then(() => {

});

Но в этот момент вам лучше простоожидание завершения вызова checkNewData перед вызовом Promise.all, так как в противном случае вы вводите гонку между checkAllData и Promise.all


Обещание - вещь "разовая", подумайтеиспользуя асинхронный итератор, если вы хотите обработать результаты (обратите внимание, для этого требуется узел 12):

async function* getRecordData() {
  for await(const item in getPromisesOfInitDataFromDatabase()) {
    yield item; // or process it
  }
  while(true) { // or how often you want
    for await(const item of getNewDastaFromDatabase()) {
      yield item; // or process it
    }
    await sleep(3000); // or some sleep timeout to not constantly poll
  }
} 

Затем в другом месте:

(async () => {
  for await(const item of getRecordData()) {
    // items are available here one by one, including new items in the database
  }
})();
...