2016-08-16 161 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); 
});