2017-01-01 11 views
-1

私はこのようなモジュールを持っています。NodeJSスコープ変数が必要です

somemodule.js

module.exports = { 
    val: null, 
    get: function() { 
    finddata('/', function(resp) { 
     this.val = resp 
    } 
    } 
} 

と、このように呼ばれている:第一get呼び出した後

var x = require('somemodule'); 
x.get(); 
x.get(); 

、このx.valが設定されていません。試してもうまくいきません:

module.exports = { 
    val: null, 
    get: function() { 
    var that = this; 
    finddata('/', function(resp) { 
     that.val = resp 
    } 
    } 
} 

x.valを設定するにはどうすればよいですか?

+0

'finddata'は非同期ですか?そのコールバックが呼び出されたと確信していますか? –

+0

これは非同期であり、呼び出されています –

+2

コールバックの 'this'キーワードは、エクスポートするオブジェクト全体ではなく関数自体を意味するため、最初のスニペットは意図した通りに機能しません。私は第2のアプローチで何か間違っているとは思わないので、どうすれば 'x.val'が設定されているかどうかチェックしましたか? 'console.log(that)'を使って設定されているかどうか確認できますか? –

答えて

2

あなたのfinddataは非同期で実行されていますが、呼び出されてすぐに戻って次の行の実行を続行します。その瞬間、そのコールバックが実行されているかどうかは分かりません。コールバックが実行されると、値のみが設定されます。値が設定されていることを確認した後、値を取得した後、約束を使用することができます。

私はちょうどそれが

a.js

module.exports = { 
     val:null, 
     get:function(){ 
      var that = this; 
      return new Promise(function(resolve, reject) { 
       that.finddata('/', function(resp){ 
        that.val = resp; 
        resolve() 
       }) 
      }); 

     }, 
     finddata :function(path,callback){ 
      setTimeout(function() { 
      console.log("Lets wait for some time"); 
      callback(10); 
      }, 100) 
     } 
    } 

b.js

var x = require('./a'); 
x.get().then(function(){ 
     console.log(x.val) 
}); 
をどのように動作するかを説明するために、2つのサンプルファイルa.jsとb.jsをとっている

出力

Lets wait for some time 

10 
+1

あなたのソリューションの説明を提供して、他の人が学ぶことができるようにしてください。これはあなたの答えをはるかに便利にするでしょう。 –

+0

ありがとうフェリックス、私もあなたから学んでいます@フェリックスキリング – Sumeet

2

まず、問題は何かを要求することではなく、範囲に関係しません。実際に何が起こっているかは、すでに他の人が述べているように、finddataは非同期関数であり、将来のコールバック012.が呼び出される時刻と、null以外の何かであることがわかりません。これに対処するには、get関数に追加のコールバックを渡すか、get関数から約束を返す必要があります。より洗練されたアプローチは、get機能からプロミスを返すことです。あなたが持っている

x.get() 
.then(() => { 
    // val is ready 
}) 

または

x.get(() => { 
    // val is ready 
}) 

もう一つの問題は、あなたがfinddataがエラーでコールバックを呼び出すどのような場合を考慮していないということでしょうか?次のようなものがあります:

finddata('/', function(resp){ 
    that.val = resp 
} 

本当にあなたが望まないものです。 finddataは、そのようなエラーが無かった場合nullでコールバックを呼び出すためのベストプラクティスをノードAに準拠した場合finddataerrorを使用して、コールバックを呼び出す場合は、持っているコードでは、valは、それ以外の場合はnullに等しいだろう、そのエラーに等しくなりますcb(null, data)となります。

あなたは何をしようとしていますか? valのものを公開するモジュールが必要ですか? getは、アプリケーションから定期的に呼び出される機能ですか?もしなぜ新しいモジュールを導入するのであれば、ちょうどそれ自身でモジュールを推測しているfinddataを呼び出してください。

関連する問題