代码之家  ›  专栏  ›  技术社区  ›  PPShein

如何在承诺内停止进程nodejs

  •  1
  • PPShein  · 技术社区  · 8 年前

    我创建了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 回复  |  直到 8 年前
        1
  •  2
  •   lipp    8 年前

    必须等待“一次”回调执行。否则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)
        2
  •  0
  •   DHIRAJ KATEKAR    8 年前

    如果要在成功完成时退出,请参阅以下代码:

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

    如果您也希望在出错时退出,请在catch块中添加process.exit(1)。