2017-01-25 11 views
0

私はプロミス(私が共通のテーマ、私が知っている)の周りに頭をラップしようとしています。私は基本的なアイデアを持っていますが、私はそれらを実装するのに問題があります。プロミスコールの結果に基づいてオブジェクトを構築する

私は、ディレクトリの内容に基づいて一連の関数を公開するオブジェクトを作成しようとしています。私はfsライブラリを約束するためにブルーバードを使用しています。次に、dirのファイルを読み込み、オブジェクトをビルドして、結果を返します。

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

私は物事の多様性を試してみたが、返されたオブジェクトは、通常、次のようになります。

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

私は履行ハンドラ内で結果を得るにはどうすればよいですか? プロミスオブジェクトの代わりに解決されたオブジェクトを返すようにするにはどうすればよいですか(さまざまな場所で解決/拒否を試みましたが、間違っています)

+0

あなたにはありません。あなたは約束を返します(これは、あなたが見ているものです、既に働いています)。それが彼らのために作られたものです。将来計算される結果を即座に返すことはできません。 – Bergi

+0

@Bergiなぜ拒否ハンドラにはありますか? – GForce

+0

@GForceあなたのオブジェクトが '_rejectionHandler0'プロパティに格納されている理由は言えませんでしたが、プロミスの内部プロパティから値を取得しようとしてはいけません。あなたは '.then()'および/または '.catch()'を呼び出してそれを操作する必要があります。 – JLRishe

答えて

0

解決されたオブジェクトを返すことはできません。それは全体のポイントです。取得しているデータは、関数がすでに返されてから、すぐに使用可能になります。

だからあなたの二つの主なオプションは以下のとおりです。

  1. は、あなたが約束を(!それは悪いことではありません)を返す機能を持っていることを受け入れます。解決値を取得したい消費者は、.then()と呼ぶことができます。

  2. あなたの関数がコールバックをとり、あなたの関数内でそれを呼び出すことを約束してください。あなたが使用しているので、

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

Bergiは、指摘したように:敗北のこの種の最初の場所での約束を使用する目的は、より多くの「ノードのような」あなたの関数のシグネチャになるだろうブルーバードは、同じ目的を達成している#2のオプションを改良して、.thenの代わりに.asCallbackを使用します。

ここで注意すべきいくつかのこと:このオプションで

  • あなたがまだあります、それはコールバック
  • に渡すことができるように、パイプラインで{services: services} -objectを取得するthen()を必要とするだろうreturn関数の6行目のステートメント。これは、.asCallback()が約束を返し、返された約束またはがコールバックを使用するかどうかを関数の呼び出し元が選択できるためです。
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

の複製と思われます。私のハングアップの一部は、結果が却下にあるということですハンドラ。それは私が何か間違っていると思うようになります。 – GForce

+0

OPはBluebirdを使用しているので、 'then()。catch()'の代わりに '.asCallback(callback)'を使うべきです – Bergi

+0

@GForce私がすでに言ったように、約束の内部について心配する必要はなく、物を使って。私が見る限り、間違ったことはしていません。 – JLRishe

関連する問題