Ember 1.0.0中的承诺 - 成功回调未触发

时间:2014-01-08 11:33:59

标签: javascript jquery json ember.js ember-data

这让我很生气。我有一个承诺,调用JSON端点为用户进行身份验证。我能够在控制台中看到此调用现在正在命中服务器并返回200 OK - 为了我的理智,我还对服务器日志进行了调整,它也返回200状态,所以我知道要求到达那里。

然而,当涉及到处理响应时,我的fail()回调每次都会触发并更新把手模板,即使表面上(根据服务器)承诺是成功的。如果我输入了错误的密码,服务器会返回401,正如我所期望的那样,所以我知道200是预期的行为。

这是Ember控制器,它处理来自表单的save操作。

Malinko.SessionsEditController = Ember.ObjectController.extend({ 
  actions: {    
    save: function() {
      var self = this;
      this.set('errorMessage', null);

      var data = {
        email: this.get('email'), 
        password: this.get('password'),
        api: 'true'
      };

      function done(response){
        console.log('Success, ' + JSON.stringify(response));
        self.transitionToRoute('index');
      };

      function fail(reason){
        console.log('Failed, ' + JSON.stringify(reason));
        self.set('errorMessage', JSON.stringify(reason));
      };

      var authenticate = Ember.$.post('https://example.com/users/sign_in.json', data);

      authenticate.then(done, fail);
    }
  }
});

我在这里缺少什么?我对Ember很新,所以它可能很简单。另外,如果它是相关的,我使用Yeoman Ember包来构建应用程序,因此它的版本是1.0.0,而不是1.3.0当前的稳定版本。

"DEBUG: Ember.VERSION : 1.0.0"
"DEBUG: Handlebars.VERSION : 1.0.0"
"DEBUG: jQuery.VERSION : 2.0.3"

编辑:

因此,如果我将authenticate承诺行更改为:

authenticate.then(done); 

没有任何事情发生,而

authenticate.then(done).then(undefined, fail);

导致fail开火;我知道它们与原作类似,但它暗示undefined是承诺的回报。我现在要重新检查服务器有效负载。

编辑2:

我怀疑this question正在描述类似的问题。返回JSON数据的控制器钩子如下:

@key = {key: user.key}
logger.debug @key.to_json
render :json => @key

编辑3:

响应小组中的FireFox网络检查员说SyntaxError: JSON.parse: unexpected end of data

1 个答案:

答案 0 :(得分:0)

好的,事实证明问题与CORS有关。使用this gem和下面的代码,我们能够成功检索响应正文。它在浏览器级别被阻止,可能是由于存在空响应主体而导致JSON.parse错误。

application.rb

config.middleware.use Rack::Cors do
  allow do
    origins '*'
    resource '*', :headers => :any, :methods => [:get, :post, :options]
  end
end