正确使用承诺

时间:2013-09-30 16:09:20

标签: jquery ajax typescript promise deferred

我有一个单独的打字稿文件,我使用它只包含我的ajax调用。

我有第二个打字稿文件,我用来加载一个淘汰可观察数组

最后,我有一个调用knockout对象的视图,然后尝试将数据绑定到下拉列表。

这是我的ajax数据通话

export class ILRDataService {
    public dataServiceOptions: DataServiceOptions;
    public getPeriodsForCandidate() {
        var urlToUse = this.dataServiceOptions.baseUrl + 'ilrdata/' +
            this.dataServiceOptions.periodIdentifier +
            '/AcademicPeriods/' + this.dataServiceOptions.candidateIdentifier;
        return $.ajax({
            url: urlToUse
        });
    }
}

这是从我班上打来的。这是调用getPeriodsForCandidate方法的方法

export class AcademicPeriod {
    private dataServiceOptions: DataServiceOptions;
    public LoadPeriodsForCandidate() {
        var self = this;
        var dataService = new Ilr.ILRDataService(self.dataServiceOptions);
        return dataService.getPeriodsForCandidate()
            .done(function (academicPeriods) {
                $.each(academicPeriods, function (index, element) {
                    self.Items.push(element);
                    console.log(element);
                });
            });
    }
}

最后在我看来,我有以下代码

var academicPeriodsViewModel = new Ilr.AcademicPeriod(dataServiceOptions);
$.when(academicPeriodsViewModel.LoadPeriodsForCandidate())
    .then(function() {
        ko.applyBindings(academicPeriodsViewModel, document.getElementById("AcademicPeriods"));
});

我的问题是在AcademicPeriod期间的LoadPeriodsForCandidate方法中,该函数立即返回,而不是在处理$ .each之后,并且导致绑定在Internet Explorer中失败。

每次绑定都不会失败。如果我打开F12开发人员工具,则绑定有效。但是如果关闭F12开发工具窗口,则绑定经常失败。我无法看到失败消息,因为我需要打开F12窗口来查看控制台,并且发生的那一刻,一切正常。

在Chrome或Firefox中使用上述代码没有问题。

我已经测试过,如果我创建一个新的回调函数并改变我的代码如下:

public LoadPeriodsForCandidate(callbackFunction) {
    var self = this;
    var dataService = new Ilr.ILRDataService(self.dataServiceOptions);
    dataService.getPeriodsForCandidate()
        .done(function (academicPeriods) {
            $.each(academicPeriods, function (index, element) {
                self.Items.push(element);
            });
            callbackFunction();
        });
    }

并将我视图中的代码更改为以下内容:

academicPeriodsViewModel.LoadPeriodsForCandidate(bindAcademicPeriods);
function bindAcademicPeriods() {
    ko.applyBindings(academicPeriodsViewModel, document.getElementById("AcademicPeriods"));
}

然后一切都在IE中运行

但是我觉得这更像是一个kludge,想要知道如何/我需要做什么来改变方法LoadPeriodsForCandidate,以便我可以成功地使用$ .when()。then()正确

1 个答案:

答案 0 :(得分:0)

您需要在函数中调用.then()而不是.done()

调用.then()将返回一个等待回调(以及它返回的任何承诺)完成的新承诺。

请注意,您无需致电$.when()