我正在尝试使用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调用?应该返回的客户端负载函数是什么?
答案 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
方法的参数failure
和load
中可用:
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中,你仍会在某些时候回到回调中。