来自Fluxxor的Ajax请求不会调度成功动作

时间:2015-07-09 06:32:19

标签: ajax reactjs reactjs-flux flux

我正在尝试使用Fluxxor从Flux动作中使用jquery.ajax。我正在使用http://fluxxor.com/guides/async-data.html上的Async示例。

通话成功(我得到了回复),但我无法弄清楚为什么它没有调度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)
      });
  }
//...
};

调用来自动作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 个答案:

答案 0 :(得分:2)

致电时

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的两个函数在success方法的参数failureload中可用:

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/

  

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

通常,异步函数不返回任何内容。您关心的值直到稍后才会出现(这使得它异步),因此您需要使用回调来执行流程。

你也可以使用像promises这样的东西来抽象出部分内容,但是在JavaScript中,你仍会在某些时候回到回调中。