我在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));
};
在dataservice模块中使用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仍然需要这次刷新能够带来承诺,因此仍然怀疑它。
答案 0 :(得分:0)
如果函数getPersons
命名良好,那么它将只执行此操作(获取人员)而不会更多,并且personsObservable
的两次调用将在getPersons
处进行。被称为。
getPersons
因此会缩小为:
var getPersons = function () {
return $.ajax({//return here to make the make the result of the $.ajax().then() chain available at the point where getPersons() is called.
url: 'api/persons',
dataType: 'json'
}).then(function (data) {
//sortPersons is presumably defined in an outer scope
return data.sort(sortPersons).map(function (item) {//return here to make the mapped array available as the promised result of getPersons.
return new model.Person(item);//return here to push elements onto the mapped array
});
});
};
注意 - 为了保持清洁和高效,在功能中没有进行任何分配
并将被称为,例如,如下:
persons([]);
getPersons().then(persons).fail(queryFailed);
整个承诺链(简写)因此是$.ajax().then().then().fail();
,但是拆分使得链中的前两个调用位于getPersons
内,这将返回一个适当的承诺。
在$.when()
函数中使用refresh
会使事情变得更加复杂。修改getTalks
的方式与getPersons
相同,refresh
可编写如下:
function refresh () {
persons([]);
talks([]);//assumed
return $.when(dataservice.getPersons(), dataservice.getTalks()).then(function (p, t) {
persons(p);
talks(t);
}, function () {
logger.log("There's been an error retrieving the data");
});
};