节点文件上传和同步

时间:2014-02-04 02:17:03

标签: javascript node.js mongoose

虽然我对节点中的基本异步模式感到满意,但我遇到了一种情况,我需要在一般同步的情况下从异步调用返回值。

鉴于功能:

modelHelper.saveFile = function(field) {
 var url = cloudinary.uploader.upload(this.req.files[field.name].path, function(result) {
     if(typeof result.url != "undefined" && result.url.length > 0) 
         {
            console.log(" \n\n\n Inside the cloudinary call.");
            console.log("\n\n URL = " + result.url);
            return result.url;
         }
     return false;
 });

 console.log("\n\n\n Outside the load, URL =" + url);

 if(!url) return "";
 return url;
};

在将文件上传到服务器的情况下调用此函数,并通过循环遍历页面所有元素的简单循环调用此函数。对于大多数情况,它是变量到值的简单映射,因此我真的不想在此函数中注入next

这是来电者:

modelHelper.parseField = function(field) {
var type = field.type;

switch(type) {
case "email":
case "url":
    return strings.exists(this.param(field.name)) ?
            this.param(field.name) : "";
    break;
case "file": 
    return modelHelper.resolveFile.bind(this)(field);
    break;
default: 
    return strings.exists(this.param(field.name)) ?
            strings.makeSafe(this.param(field.name)) : "";
} 

而这又被称为:

modelHelper.populate = function(elements, record, next){
var len = elements.length;
parseField = modelHelper.parseField.bind(this);
while(len--)
    if((elements[len]["type"] != "captcha")) 
        this[record][elements[len]['name']] = parseField(elements[len]); 

next.bind(this)();
};

因此,我正在寻找一种模式,它将阻止执行,直到saveFile中的文件操作返回一个变量;比如把它包装成一个setInterval类型的调用是我的第一个想法,但还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

callback传递给saveFile,并在上传完成后使用网址调用

 modelHelper.saveFile = function(field, callback) {
  var url = cloudinary.uploader.upload(this.req.files[field.name].path, function(result) {
    if(typeof result.url != "undefined" && result.url.length > 0) {
        console.log(" \n\n\n Inside the cloudinary call.");
        console.log("\n\n URL = " + result.url);
        return callback(null, result.url);
    }
    return callback();
  });
};