2015-11-18 2 views
0

Я работаю с Loopback, и я хочу создать интерфейс загрузки, который регистрирует количество загрузок. Я использую собственную модель вместе с компонентом хранения.Loopback - Изменение атрибута объекта после асинхронной загрузки

Я использую функцию загрузки компонента хранения, и я хочу обновить атрибут объекта uploadedPictures после успешной загрузки (см. Код ниже). У меня есть проблема, что я не знаю, как использовать «эту» ссылку после асинхронного метода безопасным способом. Например. если есть много вызовов моей функции, атрибут подсчитывается только один раз.

module.exports = function(Upload) { 
    Upload.prototype.upload = function(ctx, options, cb) { 
     if (!options) 
      options = {}; 
     ctx.req.params.container = 'common';   

     // starting the upload and wait for the result 
     var promise = new Promise(function(resolve, reject) { 
      Upload.app.models.container.upload(ctx.req, ctx.result, options, function(err, fileObj) { 
       if (err) { 
        console.error('error occured during upload'); 
        cb(err); 
       } 
       else { 
        var fileInfo = fileObj.files.file[0]; 
        resolve(fileInfo); 
       } 
      }); 
     }); 
     var uploadObject = this; // not safe, but how should I do it? 
     // count 'uploadedPictures' up, but only if upload was successful 
     promise.then(function(fileInfo) { 
      uploadObject.uploadedPictures++; 
      uploadObject.save(); 
     }) 
     .catch(function(e) { 
      console.error('error: '+e); 
     }); 
     cb(null, this); 
    }; 

    Upload.remoteMethod('upload', { 
     description : 'Uploads a file', 
     accepts : [ { 
      arg : 'ctx', 
      type : 'object', 
      http : { 
       source : 'context' 
      } 
     }, { 
      arg : 'options', 
      type : 'object', 
      http : { 
       source : 'query' 
      } 
     } ], 
     returns : { 
      arg : 'fileObject', 
      type : 'object', 
      root : true 
     }, 
     isStatic : false, 
     http : { 
      verb : 'post' 
     } 
    }); 
}; 

ответ

1

Ну, я нашел грязное решение, но оно работает. Я сам ищу объект с помощью 'findById'.

Upload.prototype.upload = function(ctx, options, cb) { 
    if (!options) 
     options = {}; 
    ctx.req.params.container = 'common'; 

    var _this = this;  
    Upload.app.models.container.upload(ctx.req, ctx.result, options, function(err, fileObj) { 
     try { 
      var files = fileObj.files.file; 
      console.log('upload success): '+JSON.stringify(files)); 
      if (files.length > 0) { 
       Upload.findById(_this.id, function(err, res) { 
        res.onUploadSuccess(cb); 
       }); 
      } 
      else { 
       cb(null, _this); 
      } 
     } 
     catch (err) { 
      console.error('WARN: Upload not successful: ' + err); 
      cb(err, null); 
     } 
    }); 
}; 

Upload.prototype.onUploadSuccess = function(cb) { 
    this.uploadedPictures++; 
    this.save(); 
    cb(null, this); 
} 
Смежные вопросы