从此nodeJS函数访问数据

时间:2017-01-21 19:19:14

标签: node.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'));

                         });

我知道这是异步的,但我正在努力解决这个问题。

2 个答案:

答案 0 :(得分:1)

我建议你使用EventEmitters。如果您想要指示是否已完成任何操作,您可以使用此选项,也可以选择传递数据。

创建一个新的javscript文件' my-emitter.js'

my-emitter.js(ES6版本)

vim

my-emitter.js(Javascript版本)

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

const myEmitter = new MyEmitter();

module.exports = myEmitter;

您的代码段
(检查代码中的注释)。发出一个事件,表示异步操作完成后var EventEmitter = require('events').EventEmitter; var util = require('util'); function MyEmitter(){ EventEmitter.call(this); } util.inherits(MyEmitter,EventEmitter); myEmitter = new MyEmitter(); module.exports = myEmitter; 可用 data

myEmitter.emit('img-op-complete',data);

<强> othermodule.js
无论您想要数据(如果在其他模块中),请使用下面的代码

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

                         });

有关事件的更多信息,https://nodejs.org/dist/latest-v6.x/docs/api/events.html

注意: Promise也是很好的解决方案,但如果你在同一个模块中需要数据,那么使用promises良好的设计。但是事件在node.js中提供了一个很好的设计模式

答案 1 :(得分:0)

我建议你使用promises,如果你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
});