2014-02-04 6 views
0

Хотя я вообще удобен с рудиментарными асинхронными узорами в узле, я столкнулся с ситуацией, когда мне требуется возвращаемое значение из асинхронного вызова в синхронной ситуации.Загрузка файлов в виде файлов и sychronicity

Учитывая функцию:

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 было моей первой мыслью, но есть ли лучший способ?

ответ

0

Передаёт callback в saveFile и вызвать его с URL, как только загрузка будет завершена

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(); 
    }); 
}; 
+0

Я абсолютно уверен, что изменение имени вызываемой функции от «далее», чтобы «обратный вызов» не обратится основная архитектурная задача. Дело в том, что в этом контексте нет разумного обратного вызова, поскольку мы не можем гарантировать, когда будет вызван saveFile (внутри контекста непредсказуемой последовательности элементов). Не дослушав лучшего ответа на исходный вопрос, я принял, что требуется изменение архитектуры, и я подталкиваю все проверки в массив обещаний и используя Q, чтобы запустить этот массив как цепочку. Еще не проверял его, но он должен работать. –

Смежные вопросы