【问题标题】:correct use of promise正确使用承诺
【发布时间】:2013-10-06 14:09:28
【问题描述】:

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

我有第二个打字稿文件,我用它来加载敲除可观察数组

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

这是我的 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 中一切正常

但是我认为这更像是一个杂项,并且想知道如何/我需要做什么来更改方法 LoadPeriodsForCandidate 以便我可以成功使用 $.when().then() 正确

【问题讨论】:

  • 什么是“打字稿文件”?
  • @Beetroot-Beetroot 查看此网站。 typescriptlang.org 它将描述什么打字稿比我能做的更好。
  • 达伦,谢谢你的链接。看起来很相关,这个问题应该被标记为“打字稿”吗?标签肯定存在。

标签: jquery ajax typescript promise deferred


【解决方案1】:

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

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

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

【讨论】:

  • 我修改了 LoadPeriodsForCandidate 以便 .done 现在使用 .then 我还删除了 $.when 以便我现在调用 AcademicPeriodsViewModel.LoadPeriodsForCandidate() .then(function() { ko.applyBindings (academicPeriodsViewModel, document.getElementById("AcademicPeriods")); });不幸的是它仍然没有在 IE 中绑定
  • @DarrenGuy:如果开发工具已关闭,IE 不会定义 console 对象,因此您会遇到运行时错误。删除所有控制台调用。
  • 谢谢,我删除了console.log语句,现在看来IE运行良好。我想了解一下为什么console.log命令在IE中会报错?
  • @DarrenGuy:在IE中,没有打开开发工具时没有console对象。因此,您收到了 console is undefined 错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 2023-04-11
相关资源
最近更新 更多