来自 Fluxxor 的 Ajax 请求未发送成功操作

Posted

技术标签:

【中文标题】来自 Fluxxor 的 Ajax 请求未发送成功操作【英文标题】:Ajax request from Fluxxor not dispatching success action 【发布时间】:2015-09-27 08:56:24 【问题描述】:

我正在尝试从使用 Fluxxor 的 Flux 操作中使用 jquery.ajax。我正在处理 http://fluxxor.com/guides/async-data.html 的异步示例。

调用成功(我收到了响应),但我不知道为什么它没有调度 LOAD_BUZZ_SUCCESS。

我正在替换这段代码:

 var BuzzwordClient = 
      load: function(success, failure) 
        setTimeout(function() 
          success(_.range(10).map(Faker.Company.catchPhrase));
        , 1000);
      
    //...
    ;

var BuzzwordClient = 
  load: function(success, failure) 
      jquery.ajax(
          url: "test.json",
          dataType: 'json',
          cache: false,
          success: function(data) 
            console.log("success");
            console.log(data);

          .bind(this),
          error: function(xhr, status, err) 
              console.log("error");
          .bind(this)
      );
  
//...
;

调用来自actions var:

BuzzwordClient.load(function(words) 
      this.dispatch(constants.LOAD_BUZZ_SUCCESS, words: words);
    .bind(this), function(error) 
      this.dispatch(constants.LOAD_BUZZ_FAIL, error: error);
    .bind(this));
  

我需要用其他东西包装 ajax 调用吗?客户端的加载函数应该返回什么?

【问题讨论】:

【参考方案1】:

当你打电话时

BuzzwordClient.load(function(words) 
  this.dispatch(constants.LOAD_BUZZ_SUCCESS, words: words);
.bind(this), function(error) 
  this.dispatch(constants.LOAD_BUZZ_FAIL, error: error);
.bind(this));

传递给load的两个函数在load方法的参数successfailure中可用:

var BuzzwordClient = 
  load: function(success, failure) 

但是这些函数永远不会被调用。请注意原始示例如何调用传递的success 函数,并传入以下语句:

success(_.range(10).map(Faker.Company.catchPhrase));

你需要在你的 Ajax 回调中做同样的事情:

var BuzzwordClient = 
  load: function(success, failure) 
      jquery.ajax(
          url: "test.json",
          dataType: 'json',
          cache: false,
          success: function(data) 
            success(data); // or something similar
          ,
          error: function(xhr, status, err) 
            failure(err); // or something similar
          
      );
  
//...
;

这是一个简单的例子:http://jsfiddle.net/BinaryMuse/6p98L2h8/

客户端的加载函数应该返回什么?

一般来说,异步函数不返回任何东西。您关心的值直到稍后才可用(这就是使其异步的原因),因此您需要使用回调来执行流程。

您也可以使用类似 Promise 的东西来抽象出其中的一部分,但在 javascript 中,您仍然会在某些时候回退到回调。

【讨论】:

谢谢!我现在能够触发成功回调,但有效负载是成功对象而不是响应。如何从该对象中提取响应?做 payload.responseJSON 似乎不起作用(给我一个未定义的)。谢谢! @sutee 动作的有效载荷是this.dispatch 的第二个参数,所以在这种情况下它是对象words: words。如果你想包含额外的数据,你需要自己把它放在那里,可能将success回调修改为BuzzwordClient.load以接受必要的数据。 也许我的问题现在超出了这个问题的范围,但我试图弄清楚如何从有效负载中提取我的响应 JSON。就我而言,words 是我的 ajax 响应返回的对象,我不知道如何提取“服务器”返回的 JSON。当我调度到 LOAD_BUZZ_SUCCESS 并尝试在 onAddBuzzSuccess 内部执行 payload.responseJSON 时,我可以看到有效负载,但 responseJSON 未定义。可能是时间问题。我认为我的问题更多的是关于 jquery,但很高兴看到一个使用 json 响应进行调用的 Fluxxor 示例。谢谢! @sutee 是的,你可能是对的。如果您还有其他问题,请查看this simple example 和contact me。 感谢您的示例!它帮助我让一切正常工作。我的问题是我在整个 ajax 调用中包装了success 回调函数。我认为这个示例对其他刚开始使用 Fluxxor 的人也会有所帮助!

以上是关于来自 Fluxxor 的 Ajax 请求未发送成功操作的主要内容,如果未能解决你的问题,请参考以下文章

Phonegap AJAX 请求未定义

来自ajaxtowards flask的发布请求后页面未呈现

如何在ajax post方法中发送json请求

文件未在 Ajax 请求中使用 FormData 发送

Ajax 错误回调未针对 iPhone 触发

SyntaxError:来自ajax发布调用的JSON输入意外结束