Redis
 sql >> Datenbank >  >> NoSQL >> Redis

For-Schleife in Redis mit asynchronen Anfragen von nodejs

Sie haben zwei Hauptprobleme.

  1. Ihre phoneNumber Variable wird nicht das sein, was Sie wollen. Das kann behoben werden, indem man zu .forEach() wechselt oder .map() Iteration Ihres Arrays, da dies einen lokalen Funktionsbereich für die aktuelle Variable erstellt.

  2. Sie haben eine Möglichkeit geschaffen, um zu wissen, wann alle asynchronen Vorgänge abgeschlossen sind. Es gibt viele doppelte Fragen / Antworten, die zeigen, wie das geht. Wahrscheinlich möchten Sie Promise.all() verwenden .

Ich würde diese Lösung vorschlagen, die die Versprechungen nutzt, die Sie bereits haben:

function getContactList(contacts) {
    var contactList = {};
    return Promise.all(contacts.filter(utils.isValidNumber).map(function(phoneNumber) {
        return db.client().get(phoneNumber).then(function(reply) {
            // build custom object
            constactList[phoneNumber] = reply;
        });
    })).then(function() {
        // make contactList be the resolve value
        return contactList;
    });
}

getContactList.then(function(contactList) {
    // use the contactList here
}, funtion(err) {
    // process errors here
});

So funktioniert das:

  1. Rufen Sie contacts.filter(utils.isValidNumber) auf um das Array nur nach gültigen Zahlen zu filtern.
  2. Rufen Sie .map() auf um durch dieses gefilterte Array zu iterieren
  3. return db.client().get(phoneNumber) aus der .map() Callback, um ein Array von Promises zu erstellen.
  4. Nachdem Sie die Daten für die Telefonnummer erhalten haben, fügen Sie diese Daten Ihrer benutzerdefinierten contactList hinzu Objekt (dies ist im Wesentlichen ein Nebeneffekt von .map() Schleife.
  5. Verwenden Sie Promise.all() auf dem zurückgegebenen Array von Versprechen, um zu wissen, wann sie alle fertig sind.
  6. Erstellen Sie die contactList Objekt, das wir aufgebaut haben, der Auflösungswert des zurückgegebenen Versprechens sein.
  7. Um es dann aufzurufen, verwenden Sie einfach das zurückgegebene Promise mit .then() um das Endergebnis zu erhalten. Es ist nicht erforderlich, ein Callback-Argument hinzuzufügen, wenn Sie bereits eine Zusage haben, dass Sie einfach zurückkehren können.