Javascript 在筛选数据后执行操作

Javascript 在筛选数据后执行操作,javascript,Javascript,我正在向数组填充数据。我向postgress中的DB发出许多请求,并希望将完成的数组响应到客户端。问题是我无法到达通知数组何时完成,我如何知道筛选器何时完成了对db的所有select调用 result.filter(function(item){ //console.log(item.followed_by) var query2 = 'SELECT user_id,action,date,element_refered FROM

我正在向数组填充数据。我向postgress中的DB发出许多请求,并希望将完成的数组响应到客户端。问题是我无法到达通知数组何时完成,我如何知道筛选器何时完成了对db的所有select调用

result.filter(function(item){
                //console.log(item.followed_by)
                var query2 = 'SELECT user_id,action,date,element_refered FROM "notifications" WHERE user_id=' + "'"+ item.followed_by +"'"

                dbp.sendDBRequest(query2,'blabla',function(results){
                 notifications.push(results)
                  console.log(notifications)  //here has data
               })
             })
console.log(notifications)  //here it doesnt have data
我试过了,但我认为我做错了:

           var p1 = new Promise(
    function(resolve, reject) {
   result.filter(function(item){
            var query2 = 'SELECT user_id,action,date,element_refered FROM "notifications" WHERE user_id=' + "'"+ item.followed_by +"'"
            dbp.sendDBRequest(query2,'blabla',function(results){
             notifications.push(results)
           })
         })

          resolve(notifications);
    }
  );

   p1.then(
    function(val) {
      console.log(notifications)
    })
  .catch(
    function(reason) {
      console.log('Manejar promesa rechazada ('+reason+') aquí.');
    });
编辑代码:

这是有承诺的代码,但我得到的不是一个过滤器(…),也不是一个函数

   var notifications = []
          var query = 'SELECT followed_by FROM "relations" WHERE follower=' +"'"+32+"'"
          dbp.sendDBRequest(query,'blabla', function(result) {
            result.filter(function(item) {
             return new Promise(function(resolve, reject) {
               var query2 = 'SELECT user_id,action,date,element_refered FROM "notifications" WHERE user_id=' + "'" + item.followed_by + "'"
               dbp.sendDBRequest(query2, 'blabla', function(results) {
                notifications.push(results);
                resolve(notifications);
             })
            })
             .then(function(val) {
               console.log(notifications)
            })
             .catch(function(reason) {
               console.log('Manejar promesa rechazada (' + reason + ') aquí.');
            });
          })
            .then(function(response){
             var secondResponse = response + '2';
             return response;
          })
            .then(function(secondResponse) {
  //facultad
})
            .catch(function(err){
               console.log(err)    
            })

         })

是的,您需要在主函数中使用promise,它将返回promise对象

result.filter(function(item) {
  new Promise(function(resolve, reject) {
      var query2 = 'SELECT user_id,action,date,element_refered FROM "notifications" WHERE user_id=' + "'" + item.followed_by + "'"
      dbp.sendDBRequest(query2, 'blabla', function(results) {
        notifications.push(results);
        resolve(notifications);
      })
    })
    .then(function(val) {
      console.log(notifications)
    })
    .catch(function(reason) {
      console.log('Manejar promesa rechazada (' + reason + ') aquí.');
    });
})
然后,你可以处理然后捕捉块。 另外,如果您想继续,您可以返回承诺对象并在末尾添加额外的…catch

result.filter(function(item) {
  return new Promise(function(resolve, reject) {
      var query2 = 'SELECT user_id,action,date,element_refered FROM "notifications" WHERE user_id=' + "'" + item.followed_by + "'"
      dbp.sendDBRequest(query2, 'blabla', function(results) {
        notifications.push(results);
        resolve(notifications);
      })
    })
    .then(function(val) {
      console.log(notifications)
    })
    .catch(function(reason) {
      console.log('Manejar promesa rechazada (' + reason + ') aquí.');
    });
})
.then(function(response){
  var secondResponse = response + '2';
  return response;
})
.then(function(secondResponse){
  ...    
})
.catch(function(err){
   console.log(err)    
})
使现代化 我认为这将实现你正在努力实现的目标

var notifications = [];

var pMain = new Promise(function(resolve, reject) {
  var query = 'SELECT followed_by FROM "relations" WHERE follower=' + "'" + 32 + "'"
  dbp.sendDBRequest(query, 'blabla', function(result) {
    resolve(result);
  })
});

pMain.then(function(p1Result) {
  var promises = [];

  p1Result.forEach(function(item) {
    return promises.push(new Promise(function(resolve, reject) {
      var query2 = 'SELECT user_id,action,date,element_refered FROM "notifications" WHERE user_id=' + "'" + item.followed_by + "'"
      dbp.sendDBRequest(query2, 'blabla', function(results) {
        resolve(results);
      });
    }));    
  });
  return Promise.all(promises).then(function(results) {
    notifications.push(results);
  }).then(function(){
    console.log(notifications);
  });
})

好的,谢谢你的回复,它返回TypeError:result.filter(…)。然后不是我添加的函数,代码completeAh!我的错。那么…抓应该是在承诺之后。查看更新后的代码我不确定如何处理sql函数中的错误,但是,为了进入catch块,需要在main Promise中的某个地方添加拒绝(error)。我认为forEach更适合于您试图完成的任务,而不是过滤。因为过滤器应该返回true/false以减少数组。