2017-01-21 10 views
-2

この関数の外で "データ"を使用したいと思います。何人かは私にどのように表示できますか?このノードからデータにアクセスするJS関数

resemble('/Users/User/Documents/dev/engineerappcopy/VGimages/'+deviceName+'.png') 
      .compareTo('/Users/User/Documents/dev/engineerappcopy/VGimages/'+"nexUpdate"+'.png') 
      .ignoreColors().onComplete(function(data) { 
       browser.sleep(5000) 
       console.log(data); 
       data.getDiffImage().pack(). 
       pipe(fs.createWriteStream('/Users/User/Documents/dev/engineerappcopy/VGimages/'+deviceName+'VG.png')); 

         }); 

私はこれが非同期であることを認識していますが、私はこれに苦労しています。

+0

を他のファイルの変数? 1つの方法は、グローバル変数として追加することです。イベントエミッタを使用してデータを渡すこともできます。このデータ変数をどこに使用するかを教えてください。私はそれに応じて助言することができます –

+0

可能なdupeのhttps:// stackoverflow。コム/質問/ 23667086 /なぜ-ある - 私の変数-変更されていない-後-I - 変更 - それを - 内部の - 機能-asynchron私はちょうど別の関数でそれを使用したい – JohnnyHK

+0

@Asifサイード...それこれは同期的ではないので、グローバル変数にすることはできません。 – iHateNodeJS

答えて

1

EventEmittersを使用することをお勧めします。アクションが完了したかどうかを示したい場合には、これを使用できます。オプションでデータも渡すことができます。

は新しいjavscriptファイル '私の-emitter.js'

私-emitter.js(ES6版)

const EventEmitter = require('events'); 
class MyEmitter extends EventEmitter {} 

const myEmitter = new MyEmitter(); 

module.exports = myEmitter; 

OR

私のエミッタを作成します。 js(Javascript版)

var EventEmitter = require('events').EventEmitter; 
var util = require('util'); 

function MyEmitter(){ 
    EventEmitter.call(this);  
} 

util.inherits(MyEmitter,EventEmitter); 
myEmitter = new MyEmitter(); 

module.exports = myEmitter; 

コードスニペット
(コードのコメントを確認してください)。非同期操作が myEmitter.emit('img-op-complete',data);

var myEmitter = require('./my-emitter.js'); //Get your emitter from the module 
resemble('/Users/User/Documents/dev/engineerappcopy/VGimages/'+deviceName+'.png') 
      .compareTo('/Users/User/Documents/dev/engineerappcopy/VGimages/'+"nexUpdate"+'.png') 
      .ignoreColors().onComplete(function(data) { 
       browser.sleep(5000) 
       //Emit the event that data is available and pass the data 
       myEmitter.emit('img-op-complete',data); 
       console.log(data); 
       data.getDiffImage().pack(). 
       pipe(fs.createWriteStream('/Users/User/Documents/dev/engineerappcopy/VGimages/'+deviceName+'VG.png')); 

         }); 

othermodule.jsあなたはデータが欲しい、これまで
(他のモジュールであれば)完了後dataが利用可能であることを言って、イベントを発する、コードの以下の部分を使用しますイベントの詳細はフォア

var myEmitter = require('./my-emitter.js'); //Get your emitter from the module 
myEmitter.on('img-op-complete', function(data){ 
    console.log(data); //You'll get your data here after op is done 
}) 

https://nodejs.org/dist/latest-v6.x/docs/api/events.html

メモ:約束は良い解決策ですが、同じモジュール内にデータが必要な場合は約束して良いデザインを使用してください。しかし、イベントはnode.jsに良いデザインパターンを提示します

+0

iは、約5時間の約束を実装しようとしたオクラホマはあきらめ、私はこの – iHateNodeJS

+0

クラスMyEmitterが持つEventEmitter {} ^^^^^ にSyntaxErrorを拡張しようとしますstrictモード – iHateNodeJS

+0

外サポート私は死にたい:) :) ITが働い – iHateNodeJS

0

私は約束を持って行くことをお勧めします。もしあなたがexportならば、モジュール全体でこの約束を使うことができます。

Promiseのような約束をどのように使用するかについての素晴らしい記事があります。約束を経由して上記の問題にアプローチする方法に来

function foo(){ 
    return new Promise(function(resolve,reject){ 
     resemble(<yourPath>) 
     .compareTo(<yourPath>) 
     .ignoreColors().onComplete(function(data) { 
      //for best practice do handle errors 
      if(err<anyError>){ 
       reject(err); 
      } else{ 
       resolve(data); 
      } 
     }); 
    }) 
} 

今、あなたはデータ変数を使用したい上記の約束を使用することができます:あなたがデータを使用したい

foo().then(function(<data>){ 
    //do whatever you wish to do with the data 
}).catch(function(<err>){ 
    //handle the error 
}); 
+0

こんにちはamitesh、あなたに非常に感謝します。私はそれを実装しようとしている、あなたは "foo.then"の引数にと言うが、データはどうあるべきか?申し訳ありませんが、これは私がこれまでにnodeXS – iHateNodeJS

+0

エラーを拒否するたびにエラー – iHateNodeJS

+0

を使用した初めての場合です。解決されたデータはオブジェクトオブジェクト – iHateNodeJS

関連する問題