如何处理'promis'数组

时间:2017-12-04 07:01:43

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

我构建了一个数据库,其中包含使用请求密钥从firebase接收消息的用户列表。每次插入状态为“open”的新请求时,我都会尝试按“Timestamp”的值对它们进行排序,然后通过此顺序将其发送给接收方(每个接收方将收到一条消息)。 如果接收器列表为空,我想保留它,直到另一个接收器被添加到列表并继续下一个请求。 我不知道如何一个接一个地发送每个'承诺' -

exports.notificationListener=functions.database.ref('requests')
.onWrite(event=>{
    const ref = event.data.ref;
    let requests= [];    
    var query=ref.orderByChild('TimeStamp');

    query.once('value',function(snap){
        snap.forEach(request=>{
            if(request.val().Status==OPEN)  
                requests.push(request.key);
        });
    });
    for (let key of requests) {
       return getOnlinReceiversToken().then(token=>{
       let msg = {
        data: {
          source: key
               }
         };
         return admin.messaging().sendToDevice(token, msg);
       )};
     }
 });

function getOnlinReceiversToken() {
    let result = new Promise((resolve, reject) => {
     receiverRef.once('value', (snap) => {
      resolve(snap);
        }, 
       (err) => {
         reject(err);
      });
    });
    return result.then(snap => {
        snap.forEach(child => {
            if(child.Status == ONLINE){
                let token = helper.getToken(child.key,db);
                break;  
            }  
        });
        return token; 
    });
  }

2 个答案:

答案 0 :(得分:0)

尝试这样的事情

var promisesArray = [];
for (let key of requests) {
   var currentPromise = getOnlinReceiversToken().then(token=>{
       let msg = {
        data: {
          source: key
               }
         };
         return admin.messaging().sendToDevice(token, msg);
     });
  promisesArray.push(currentPromise);
}

return Promise.all(promisesArray);

答案 1 :(得分:0)

你可以使用一个函数来调用自己按顺序遍历promises,一个接一个地发送它们

function runPromise(index) {
  // jump out of loop if there are no more requests
  if (index >= requests.length) {
    return console.log('finished!');
  }

  return getOnlinReceiversToken().then((token) => {
    let msg = {
      data: { source: key }
    };
    admin.messaging().sendToDevice(token, msg);
    // iterate to the next item
    return runPromise(index + 1);
  }).catch((err) => {
      // break out of loop when an error occurs
      console.log(err);
  });
}

runPromise(0);