虽然我对节点中的基本异步模式感到满意,但我遇到了一种情况,我需要在一般同步的情况下从异步调用返回值。
鉴于功能:
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 :(得分: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();
});
};