我有一个Meteor.method创建一个图像并写入CSS。我有一个微调器,直到方法返回。该方法几乎在创建图像和css的函数完成之前立即返回。
如何在从Meteor.method返回之前包含回调以等待图像和css写入?
这是我的方法:
createImage: function(coords) {
console.log('1: createImage')
var source="myimage.png";
var im = gm.subClass({imageMagick: true});
im(source)
.crop()
.write('newimage.png', function(err){
if (err) return console.dir(arguments)
console.log('4: image has been written')
}) // end of write function
fs.appendFile(directory + 'css.import.less', css, function (err) {
if (err) throw err;
console.log('3: The "data to append" was appended to file!');
});
console.log('2: image and css written')
return true;
},
我按照它们显示的顺序对控制台日志进行了编号。我想要的是console.log消息按照它们的写入顺序显示。
所以不要这样:
//start of method
console.log('1: createImage')
console.log('4: image has been written')
console.log('3: The "data to append" was appended to file!');
console.log('2: image and css written')
//end of method
我希望如此:
//start of method
console.log('1: createImage')
console.log('2: image has been written')
console.log('3: The "data to append" was appended to file!');
console.log('4: image and css written')
//end of method
目前,该方法在写入图像和css的函数返回之前返回。这样做的结果是微调器显示一瞬间,而不是等到创建图像和css的函数返回,这意味着微调器应该显示更长的时间。
答案 0 :(得分:0)
JS中有一个名为Promises
的东西。 http://www.html5rocks.com/en/tutorials/es6/promises/
我认为这可能有助于你弄明白。基础知识是这样的:
somePromiseShim(function(next) {
console.log("first"); next();
}).then(function(data, next) {
console.log("second"); next();
}).then(function(data, next) {
console.log("third"); next();
});
你可能会问自己为什么要使用它 - 它有助于做同步异步。所以我们在上面的代码中添加一些异步功能。
somePromiseShim(function(next) {
console.log("first");
setTimeout(function() { next(); }, 1000);
}).then(function(data, next) {
console.log("second will fire up after 1 second"); next();
}).then(function(data, next) {
console.log("third");
});
我在这里为朋友做了一个简单的Promise实现:https://gist.github.com/Schniz/0f525060aa9bec0b8d69 您可以使用此演示学习如何使用它。