2016-09-13 3 views
1

Ich habe eine Meteor-Methode, die versucht, die Datenbank zu manipulieren, und bei Erfolg ruft eine asynchrone Methode auf. Ich möchte in der Lage sein, diese Methode aufzurufen und das Ergebnis des Async-Aufrufs oder des Fehlers von der Datenbankmanipulation zurückzugeben.Meteor, Verkettung Methodenaufrufe

Dies ist (grob) mein Code auf dem Server:

Meteor.methods({ 
    'data.update'(id, data) { 
     Collection.update({id_: id}, {$set: {data: data}}, error => { 
      if (error) { 
       // Have method return Meteor error for DB-failure 
      } else { 
       callAsync(id, (error, res) => { 
        if (error) { 
         // Have method return Meteor error for async call failure 
        } else { 
         // Have method return success(res) 
        } 
       }) 
      } 
     }) 
    } 
}); 

Ich habe über Futures und Versprechungen zu lesen, aber ich bin neu in die Konzepte und ich bin nicht sicher, wann was zu verwenden. Vorzugsweise suche ich nach einer Lösung, die nicht auf externen Bibliotheken außerhalb von Meteor/ES6 beruht. Frage zum Bonus (verwandt): Was wird normalerweise nach einer Datenbankmanipulation zurückgegeben, die mir einen Rückruf an eine Methode anhängen lässt?

+0

Es gibt keinen Unterschied zwischen Futures und Versprechen (neben der Terminologie)? Obwohl wir sie in JS "Versprechungen" nennen, und ja, sollten Sie eine zurückgeben. – Bergi

+0

Wie gesagt, ich bin neu in den Konzepten. Ich weiß, dass sie in Scala anders sind, aber verwandte Konzepte und Wikipedia sagt "Futures und Versprechungen entstanden in funktionaler Programmierung und verwandten Paradigmen (wie Logikprogrammierung), um einen Wert (eine Zukunft) von seiner Berechnung zu entkoppeln (ein Versprechen) ". Ein großer Unterschied zwischen Futures und Versprechungen in JS ist, dass Sie nur eine sinnvolle Suche nach Google durchführen können;). – Reason

+0

Ja, [Terminologie] (http://StackOverflow.com/q/29268569/1048572) ist ein bisschen komisch in JS. Wir sprechen von Aufträgen und Versprechen anstelle von Versprechen und Termingeschäften, und die Aufschubszahlungen werden ohnehin zugunsten von reinen Rückrufen eingestellt. – Bergi

Antwort

3

nach docs

Wenn Sie auf dem Server keinen Rückruf bereitstellen, aktualisieren Sie die Blöcke solange, bis die Datenbank den Schreibvorgang bestätigt oder eine Ausnahme auslöst, wenn etwas schief gelaufen ist. Wenn Sie einen Rückruf bereitstellen, gibt update sofort zurück. Sobald das Update abgeschlossen ist, wird der Rückruf mit einem einzelnen Fehlerargument im Fall eines Fehlers oder einem zweiten Argument aufgerufen, das die Anzahl der betroffenen Dokumente angibt, wenn das Update erfolgreich war.

Also, wenn die update erfolgreich ist, wird die Anzahl der Dokumente betroffen zurückgegeben. Bei insert wird die _id des eingefügten Dokuments zurückgegeben.

Sie können einfach ein drittes Argument an die Update-Funktion übergeben, wie bereits erwähnt.

Für die Implementierung von Versprechen können Sie Meteor.wrapAsync Methode verwenden. Sie können auch Meteor.bindEnvironment ansehen, um das zu erreichen, wenn Sie den Status von Instanzvariablen ebenfalls übergeben müssen.

1

Sie können prüfen, mit Promises, aber es gibt eine andere ziemlich Standard-Art der Handhabung von so etwas in der Meteor-Ökosystem. Sie können Meteor.wrapAsync verwenden, um Ihre asynchrone Rückruffunktion in eine Fibers basierte Version zu konvertieren. Dadurch können Sie Rückgabewerte und Ausnahmen nutzen. Hier ist ein kurzes Beispiel:

1) Lassen Sie uns sagen, wir haben eine interne Funktion irgendwo increaseLifetimeWidgetCount genannt, die unser Leben lang Widget Zahl in der Datenbank irgendwo erhöht, ruft dann einen Rückruf entweder mit einem Fehler oder der neu aktualisierten Lebensdauer Zahl:

function increaseLifetimeWidgetCount(callback) { 
    // ... 
    // increase the lifetime widget count in the DB somewhere, and 
    // get back the updated widget count, or an error. 
    // ... 
    const fakeError = null; 
    const fakeLifetimeWidgetCount = 1000; 
    return callback(fakeError, fakeLifetimeWidgetCount); 
} 

2) Nehmen wir an, wir haben dann eine einfache Methode definiert, die ein neues Widget in unserer Datenbank erstellen wird, rufen Sie unsere interne increaseLifetimeWidgetCount Funktion auf und geben Sie dann die neu aktualisierte Lebensdauer Widget Count. Da wir die aktualisierte Lebensdauer Widget Zahl zurückkehren wollen, werden wir unseren Rückruf increaseLifetimeWidgetCount Funktion in einem Meteor.wrapAsync Aufruf basiert wickeln, und geben das Ergebnis:

Meteor.methods({ 
    newWidget(data) { 
    check(data, Object); 
    Widgets.insert(data); 
    const increaseLifetimeWidgetCountFiber = 
     Meteor.wrapAsync(increaseLifetimeWidgetCount); 
    const lifetimeWidgetCount = increaseLifetimeWidgetCountFiber(); 
    return lifetimeWidgetCount; 
    } 
}); 

3) Wir können dann die newWidget Methode von unserem Client aufrufen, mit einem asynchronen Rückruf, und Griff entweder den zurückgegebenen Fehler oder zurück Lebensdauer Widget zählen:

Meteor.call('newWidget', { 
    name: 'Test Widget 1' 
}, (error, result) => { 
    // Do something with the error or lifetime widget count result ... 
    console.log(error, result); 
});