我想在此功能之外使用“数据”。有人可以告诉我怎么样?
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)
我建议你使用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
});