Javascript 在筛选数据后执行操作
我正在向数组填充数据。我向postgress中的DB发出许多请求,并希望将完成的数组响应到客户端。问题是我无法到达通知数组何时完成,我如何知道筛选器何时完成了对db的所有select调用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
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以减少数组。