这实际上是js的承诺吗?

时间:2014-06-23 13:21:59

标签: ajax promise knockout-2.0

我在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仍然需要这次刷新能够带来承诺,因此仍然怀疑它。

1 个答案:

答案 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");
    });
};