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