как остановить процесс nodejs в рамках обещаний - PullRequest
0 голосов
/ 04 июня 2018

Я создал nodejs для запуска (с cronjobs) базы данных реального времени firebase следующим образом:

var db = admin.database();
var ref = db.ref('myusers');

var promises = [];

function updateUnlocked(isLocked, locked, msisdn) {
    return new Promise(function (resolve, reject) {
        if (isLocked === 1) {
            var startDate = moment(locked);
            var endDate = moment();
            var result = endDate.diff(startDate, 'minutes');
            if (result > 5) {
                var ref = db.ref('myusers/' + msisdn);
                ref.update({isLocked: 2});
            }   
        }
        resolve('done');
    });
}

ref.once('value', function(snapshot) {
    snapshot.forEach(childSnapshot => {
        promises.push(updateUnlocked(childSnapshot.val().isLocked, childSnapshot.val().locked, childSnapshot.key));
    });
});


Promise.all(promises).then(function(data) {
    console.log(data);
}).catch(function(err) {
    console.log('error');
});

Пожалуйста, дайте мне знать, где я могу добавить process.exit().Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

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

var db = admin.database();
var ref = db.ref('myusers');


function updateUnlocked(isLocked, locked, msisdn) {
  ...
}

ref.once('value', function(snapshot) {
   const promises = snapshot.map(childSnapshot => {
     return updateUnlocked(childSnapshot.val().isLocked, childSnapshot.val().locked, childSnapshot.key);
   })
   Promise.all(promises).then(() => {
     console.log('done')
     process.exit(0)
   }).catch(err => {
     console.log('error', err)
     process.exit(1)
   })
});

Демонстрация потока управления.

setTimeout(() => {
  const x = [1, 2, 3]
  const promises = x.map(i => {
    return new Promise(resolve => resolve(i))
  })
  Promise.all(promises).then(() => {
    console.log('done. process.exit(0) here')
  })
}, 200)
0 голосов
/ 04 июня 2018

Если вы хотите выйти при успешном завершении, обратитесь к следующему коду:

Promise.all(promises).then(function(data) {
 console.log(data);
 process.exit(0);

}).catch(function(err) {
console.log('error');
});

Если вы также хотите выйти при ошибке, добавьте process.exit (1) в блоке catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...