【发布时间】:2014-06-23 13:21:58
【问题描述】:
我在 javascript 模块中有这段代码(我正在使用 Require js 和 Knockout)
var getPersons = function(personsObservable) {
personsObservable([]);
var getOptions = {
url: 'api/persons',
type: 'GET',
dataType: 'json'
};
return $.ajax(getOptions)
.then(querySucceeded)
.fail(queryFailed);
function querySucceeded(data) {
var persons = [];
data.sort(sortPersons);
data.forEach(function (item) {
var p = new model.Person(item);
persons.push(p);
});
personsObservable(persons);
};
}
然后在另一个使用该模块的模块中,我这样称呼它:
function refresh() {
return dataservice.getPersons(persons).then(dataservice.getTalks(talks));
};
正在 getTalks 数据服务模块中的另一个功能。
但我不确定结果是否会成为实际的承诺,即在我用 ajax 调用的结果填充人员之前,不会调用 getTalks。据我了解,调用 then 方法可以解决问题,对吗?
谢谢
更新:
所以在阅读了答案并进一步调查了我想出的这些承诺之后,不知道是否有意义
现在 getPersons 和 getTalks 不会填充 observable 而只是返回数组,刷新函数如下所示:
function refresh() {
return $.when(dataservice.getPersons(persons), dataservice.getTalks(talks))
.then(
//Success
function (personArgs, talksArgs) {
persons(personArgs);
talks(talksArgs);
},
//Failure
function(){
logger.log("There's been an error retrieving the data");
});
};
TI 仍然需要此刷新返回一个承诺,因此仍然对此表示怀疑。
【问题讨论】:
-
这个
.then(dataservice.getTalks(talks))应该是.then(function() {return dataservice.getTalks(talks)})。您需要传递可以在将来执行的函数引用。您正在立即执行它并传递它的返回值。
标签: ajax promise knockout-2.0