Meteor:在从Meteor.method返回之前,如何等待返回的函数?

时间:2014-09-09 20:52:02

标签: javascript meteor

我有一个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的函数返回,这意味着微调器应该显示更长的时间。

1 个答案:

答案 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 您可以使用此演示学习如何使用它。