2017-04-06 3 views
0

Ich fülle Daten in ein Array. Ich mache viele Anfragen an eine Datenbank im Postgreß und möchte das fertige Array an den Client beantworten. Das Problem ist, dass ich nicht erreichen kann, wenn das Benachrichtigungsfeld vollständig ist. Wie kann ich wissen, wann der Filter alle Wählaufrufe für db abgeschlossen hat?Aktion nach dem Filtern von Daten

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 

Ich habe versucht, mit dem Versprechen denken bt ich es falsch gemacht haben:

  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í.'); 
    }); 

bearbeiten Code:

Dies ist der Code mit dem Versprechen, aber ich habe dann nicht ein Filter (...) .das ist keine Funktion

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)  
      }) 

     }) 

Antwort

1

Ja, Sie müssen innerhalb Ihrer Hauptfunktion versprechen und es wird Versprechen Objekt zurückgeben.

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í.'); 
    }); 
}) 

Dann können Sie dann umgehen und Blöcke fangen. Wenn Sie den Vorgang fortsetzen auch wollen, können Sie dieses Versprechen Objekt zurück und fügen Sie zusätzliche dann ... am Ende fangen

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)  
}) 
UPDATE

Ich denke, das zu tun, was Sie

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); 
    }); 
}) 
versuchen zu erreichen
+0

ok danke für die Antwort, es gibt TypeError: result.filter (...). Dann ist keine Funktion Ich habe den Code komplett – arnoldssss

+0

Ah! mein Fehler. dann..Catch sollte nach Promise sein. Siehe den aktualisierten Code –

+0

Ich bin mir nicht sicher, wie Sie Fehler in dieser SQL-Funktion behandeln, aber um in Catch-Blöcke fallen zu können, müssen Sie einen Fehler (Fehler) irgendwo in Hauptversprechen hinzufügen. –

Verwandte Themen