2016-08-16 115 views
0

如何等待函数返回。是否有一种方法可以等待函数在继续执行代码之前完成执行。我想在继续之前等待createThumbnail函数返回缓冲区。谢谢。nodejs等待函数执行

createThumbnail: function(imagepath){ 
    Jimp.read(imagepath).then(function (lenna) { 
     lenna.resize(256, 256)   // resize 
      .quality(60)     // set JPEG quality 
      // .greyscale()     // why on earth would i need black and white 
      .getBuffer(Jimp.MIME_JPEG,function(err, buffer, callback){ // I have other Options like png etc. 

       return buffer; 

      }) 
    }).catch(function (err) { 
     console.error(err); 
    }); 

}, 

,然后在另一个文件中我调用这个函数

var thum_image = functions_api.createThumbnail(Imagepath); 
console.log(thum_image); // its null 
+2

阅读有关'callback'和'Promise'在JavaScript .. – Rayon

回答

1

您可以使用回调。

回调是一旦某件事情完成就会执行的函数,在您的情况下最终加载图像。

而不是只服用1个参数,带你调用一个附加功能,您加载图像后:

createThumbnail: function(imagepath, callback){ 
    Jimp.read(imagepath).then(function (lenna) { 
     lenna.resize(256, 256)   // resize 
      .quality(60)     // set JPEG quality 
      // .greyscale()     // why on earth would i need black and white 
      .getBuffer(Jimp.MIME_JPEG,function(err, buffer, callback){ // I have other Options like png etc. 
       callback(buffer); 
       return buffer; 

      }) 
    }).catch(function (err) { 
     console.error(err); 
    }); 

}, 

然后你就可以调用函数一样

var thum_image = functions_api.createThumbnail(Imagepath, function (image) { 
    console.log("Loaded!", image); 
}); 
+0

我得到一个错误。当我尝试你的解决方案时,回调不是一个函数。 – Jones

+0

@Jones听起来你没有改变你调用函数的方式,你需要添加回调作为第二个参数。 – James

+0

我做过,我甚至试图复制粘贴你的代码。 – Jones

-1

您需要使用的承诺。退房的包qasync

在q您可以执行以下操作:

var q = require('q') 
createThumbnail: function loadImage(imagepath) { 
    var deferred = q.defer(); 
    Jimp.read(imagepath).then(function (lenna) { 
     lenna.resize(256, 256)   // resize 
      .quality(60)     // set JPEG quality 
      // .greyscale()     // why on earth would i need black and white 
      .getBuffer(Jimp.MIME_JPEG,function(err, buffer, callback){ // I have other Options like png etc. 
       deferred.resolve(buffer) 
      }) 
    }).catch(function (err) { 
     deferred.reject(err) 
    }); 
} 

//WHEREVER YOU WANT THE BUFFER 
createThumbnail(imagepath).then(function(buffer) { 
    console.log(buffer) 
}).catch(function(error) { 
    console.log(error) 
}).done(); 
1

您已经使用promiseJimp包。根据您可以在代码中使用的承诺以及

createThumbnail: function(imagepath) { 
    return new Promise(function (resolve, reject) { 
     Jimp.read(imagepath).then(function (lenna) { 
      lenna.resize(256,256) 
      .quality(60) 
      .getBuffer(Jimp.MIME_JPEG,function(err, buffer, callback) { 
       if(!err) 
        resolve(buffer); 
       else 
        reject(err); 
      }) 
     }).catch(function (err) { 
      console.error(err); 
      reject(err); 
     }); 
    }); 
} 


var thum_image = functions_api.createThumbnail(Imagepath) 
.then(function (thum_image) { 
    console.log(thum_image); 
}) 
.catch(function (err) { 
    console.error(err); 
});