如何在promises中停止进程nodejs

时间:2018-06-04 09:49:59

标签: node.js firebase firebase-realtime-database

我创建了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 :(得分:2)

您必须等待“一次”回调才能执行。否则,promise数组为空,进程可以立即退出。

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)

答案 1 :(得分:0)

如果您想在成功完成后退出,请参阅以下代码:

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

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

如果你想在错误时退出,那么在catch块中添加process.exit(1)。