2017-01-25 2 views
0

bauen Ich versuche, meinen Kopf um Versprechen (ein gemeinsames Thema, ich weiß). Ich habe die grundlegenden Ideen, aber ich habe Probleme, sie zu implementieren.ein Objekt basierend auf Ergebnis des Versprechens Anruf

Ich versuche, ein Objekt zu erstellen, das eine Reihe von Funktionen basierend auf dem Inhalt eines Verzeichnisses verfügbar macht. Ich benutze Bluebird, um die FS-Bibliothek zu promisifizieren. Lesen Sie dann die Dateien des Verzeichnisses ein, erstellen Sie die Objekte und geben Sie das Ergebnis zurück.

var Promise = require('bluebird'), 
    fs = Promise.promisifyAll(require('fs')); 

    var services = {}; 

    return fs.readdirAsync('./path/to/file/') 
     .each(function (filename) { 
      //trim off the file extension and assign the export function 
      services[filename.replace(/\.[^/.]+$/, "")] = function(request) { 
       request.esbOperation = filename; 
       otherFunctionCall(request); 
      } 
     }) 
     .then(function() { 
      return {services: services}; 
     }) 
     .catch(function(err){ 
      console.log(err); 
     }); 

Ich habe eine Vielzahl von Dingen versucht, aber das zurückgegebene Objekt sieht in der Regel wie folgt aus:

Promise { 
    _bitField: 167772160, 
    _fulfillmentHandler0: undefined, 
    _rejectionHandler0: 
    { services: 
     { function1: [Function], 
     function2: [Function], 
     function3: [Function], 
     }, 
    _promise0: undefined, 
    _receiver0: undefined } 

Wie kann ich das Ergebnis bei der Erfüllung Handler bekommen? Wie erhalte ich die Rückgabe des aufgelösten Objekts anstelle des Promise-Objekts (ich habe versucht, an verschiedenen Stellen aufzulösen/abzulehnen, aber ich mache es falsch)?

+0

Sie dies nicht tun. Sie geben das Versprechen zurück (was Sie sehen, da es bereits funktioniert). Dafür sind sie gemacht. Sie können nicht sofort ein Ergebnis zurückgeben, das in der Zukunft berechnet wird. – Bergi

+0

@Bergi Warum ist es im Ablehnungshandler? – GForce

+0

@GForce Ich konnte nicht sagen, warum Ihr Objekt in der '_rejectionHandler0'-Eigenschaft gespeichert ist, aber Sie sollten nicht versuchen, Werte aus den internen Eigenschaften des Versprechens zu erhalten. Sie sollten '.then()' und/oder '.catch()' aufrufen, um damit zu arbeiten. – JLRishe

Antwort

0

Sie können das aufgelöste Objekt nicht zurückgeben. Das ist der springende Punkt. Die Daten, die Sie erhalten, sind verfügbar, lange nachdem Ihre Funktion bereits zurückgegeben wurde.

So Ihre beiden wichtigsten Optionen sind:

  1. Akzeptieren Sie, dass Sie eine Funktion haben, die ein Versprechen gibt (das ist keine schlechte Sache!). Verbraucher, die den Auflösungswert erreichen wollen, können .then() darauf anrufen.

  2. Haben Sie Ihre Funktion nehmen einen Rückruf und haben das Versprechen innerhalb Ihrer Funktion rufen Sie es auf. Diese Art von Niederlagen der Zweck der Versprechungen in erster Linie verwenden, sondern Ihre Funktion Unterschrift mehr „node-like“ machen:

function myFunction(callback) { 
    var Promise = require('bluebird'), 
    fs = Promise.promisifyAll(require('fs')); 

    var services = {}; 

    fs.readdirAsync('./path/to/file/') 
     .each(function (filename) { 
     //trim off the file extension and assign the export function 
      services[filename.replace(/\.[^/.]+$/, "")] = function(request) { 
       request.esbOperation = filename; 
       otherFunctionCall(request); 
      } 
     }) 
     .then(function() { 
      callback(null, {services: services}); 
     }, function(err){ 
      callback(err); 
     }); 
} 

Wie Bergi hat darauf hingewiesen, da Sie verwenden Bluebird eine Verbesserung auf der # 2-Option, die immer noch die gleichen Enden erreicht, ist .asCallback statt dieser .then zu verwenden.

Ein paar Dinge beachten hier:

  • Bei dieser Option werden Sie müssen noch ein then() den {services: services} -Objekt in der Pipeline zu bekommen, so dass es
  • Es gibt ein an den Rückruf übergeben werden return Anweisung auf der 6. Zeile der Funktion. Dies liegt daran, dass .asCallback() ein Versprechen zurückgibt und es Anrufern Ihrer Funktion ermöglicht, auszuwählen, ob sie das zurückgegebene Versprechen oder einen Rückruf verwenden möchten.
function myFunction(callback) { 
    var Promise = require('bluebird'), 
    fs = Promise.promisifyAll(require('fs')); 

    var services = {}; 

    return fs.readdirAsync('./path/to/file/') 
     .each(function (filename) { 
     //trim off the file extension and assign the export function 
      services[filename.replace(/\.[^/.]+$/, "")] = function(request) { 
       request.esbOperation = filename; 
       otherFunctionCall(request); 
      } 
      return {services: services}; 
     }) 
     .then(function() { return {services: services} }) 
     .asCallback(callback); 
} 
+0

Teil meines Aufhängens ist, dass das Ergebnis in der Ablehnung ist Handler. Das lässt mich denken, dass ich etwas falsch mache. – GForce

+0

Da OP Bluebird verwendet, sollten Sie '.asCallback (callback)' anstatt das 'then() verwenden. Catch()' dinge – Bergi

+0

@GForce Wie ich bereits sagte, sollten Sie sich über die Interna des Versprechens Sorgen machen und es tatsächlich versuchen das Ding benutzen. Soweit ich sehen kann, machst du nichts falsch. – JLRishe

Verwandte Themen