我正在将cordovacordova-plugin-file-transfer插件与基于主干的应用程序一起使用。

我有一个Backbone.View具有称为saveReport的方法。然后,我有一个Backbone.Model,它具有一个称为savePic的函数。这是myView.saveReport的样子:

saveReport:function(){
    var promise = $.Deferred();
    promise.resolve();
    var that = this;
    promise.then(function(){
      var savePicPromise = $.Deferred();
      savePicPromise.resolve();
      for(var i=1; i< that.miniatureViews.length; ++i){
        savePicPromise = savePicPromise.then(function(){
          return that.miniatureViews[i].pictureModel.savePic();
        });
      }
      return savePicPromise;
    }).then(function(){
       // here I do all other things
       // ...
       // ...
    }); // promise chain.


myModel.savePic看起来像这样:

savePic: function(){
      var url = this.urlRoot;
      var options = new FileUploadOptions();
      options.fileKey="image";
      options.fileName=this.imgURI.substr(this.imgURI.lastIndexOf('/')+1);
      options.mimeType="image/jpeg";

      var ft = new FileTransfer();
      var myResponse; // to be set by callbacks.

      var that = this;
      this.savePromise = $.Deferred; // this should put a promise object into the model itself.

      ft.upload(this.imgURI,
        encodeURI(url),
        function(r){
          that.savedURL = r.response; // this is the URL that the APi responds to us.
          that.savePromise.resolve();
        },
        function(e){
          console.error(e);
          window.analytics.trackEvent('ERROR', 'savingPic',e.code);
          that.savePromise.fail();
        },
        options);

      return this.savePromise;
    },


我还对代码进行了一些更改,还尝试了其他2种模型方法的配置:

ft.upload(this.imgURI,
        encodeURI(url),
        this.resolveSavePromise,
        this.failedSavePromise,
        options);


具有2个功能:

resolveSavePromise: function(r){
      this.savedURL = r.response; // this is the URL that the APi responds to us.
      this.savePromise.resolve();
    },
    failedSavePromise: function(e){
      console.error(e);
      window.analytics.trackEvent('ERROR', 'savingPic',e.code);
      this.savePromise.fail();
    },


注意:在第二个选项中,我没有在savePic方法中返回任何内容。

问题是在saveReport方法的for循环中,存储在pictureModel中的promise实际上不是一个promise,或者至少表现得很奇怪。我在显示this.savePromise.resolve()的行上收到错误:that.savePromise.resolve is not a function. (In 'that.savePromise.resolve()', 'that.savePromise.resolve' is undefined)"

有没有更好的方法可以使插件的upload功能很好地与promises一起工作?

谢谢

最佳答案

您忘记创建延期了。你只是在做

this.savePromise = $.Deferred;


当你真正想要

this.savePromise = new $.Deferred; // or
this.savePromise = new $.Deferred(); // or
this.savePromise = $.Deferred();


$.Deferred工厂确实没有.resolve方法。

顺便说一句,您将要return this.savePromise.promise()而不是延迟的对象。

08-26 03:09