【问题标题】:how to call only last promise from loop如何从循环中仅调用最后一个承诺
【发布时间】:2016-06-22 00:30:31
【问题描述】:

我是新的承诺,任何人都可以帮忙 这里的承诺是随机解决的,如何在完整循环执行时从循环中解决最后一个承诺
这里假设 this.selectedValues 有 4 个值,但有时它只更新三个值,有时它更新所有值(4),这是来自 promise 的问题

var promise;
private values: Object[] = [];
_.each(this.selectedValues, (selectedValue) => {
    promise = that.valueService.getValuesForName(selectedValue).then((pg) => {
        values.push({
            Id: pg.Id,
            Name: pg.Name,
            Description: pg.Description,
            Policies: pg.Policies
        });
    });
});

if (promise !== undefined) {
    promise.then(() => { // i want to call promise only once for last index
        var data: Object = {
            Id: that.id,
            Name: name,
            Description: description,
            Values: values
        };
        that.updateEdit(data, name);
    });

【问题讨论】:

  • 查看 $q 服务的 all() 方法。它接受一个承诺的数组或散列,并返回一个承诺,当所有承诺都已解决时,该承诺将解决。如果任何一个 Promise 被拒绝,$q.all() 会立即拒绝。

标签: javascript jquery angularjs typescript promise


【解决方案1】:
var promise = Promise.resolve();
private values: Object[] = [];
_.each(this.selectedValues, (selectedValue) => {
    promise = promise.then(function() {
        return that.valueService.getValuesForName(selectedValue);
    }).then((pg) => {
        values.push({
            Id: pg.Id,
            Name: pg.Name,
            Description: pg.Description,
            Policies: pg.Policies
        });
    });
});

if (promise !== undefined) {
    promise.then(() => { // i want to call promise only once for last index
        var data: Object = {
            Id: that.id,
            Name: name,
            Description: description,
            Values: values
        };
        that.updateEdit(data, name);
    });
}

【讨论】:

    【解决方案2】:
    thanks a lot for replying finally $q solved my problem
    
     var promise,promises=[];
    private values: Object[] = [];
    _.each(this.selectedValues, (selectedValue) => {
        promise = that.valueService.getValuesForName(selectedValue).then((pg) => {
            values.push({
                Id: pg.Id,
                Name: pg.Name,
                Description: pg.Description,
                Policies: pg.Policies
            });
        });
          promises.push(promise);
    });
    
     var combinedPromise = this.$q.all(promises);
    if (combinedPromise !== undefined) {
        combinedPromise.then(() => { // i want to call promise only once for last index
            var data: Object = {
                Id: that.id,
                Name: name,
                Description: description,
                Values: values
            };
            that.updateEdit(data, name);
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-07
      • 2014-10-25
      • 1970-01-01
      • 2018-10-13
      • 2019-12-07
      • 2016-05-20
      • 2015-03-10
      • 2021-02-04
      相关资源
      最近更新 更多