通过Web服务修改对象列表,如何获取最终值列表

Modify list of objects via WebService, how to get final Value List?

本文关键字:列表 获取 服务 Web 修改 对象 通过 何获取      更新时间:2023-09-26

我从 Web 服务获取数据,我需要将此数据发送到另一个服务以修改某些值,因此当我获取数据时,需要进行更多的异步调用。我不知道如何获得最终值。

我想称呼:

SomeService.getSomething(id).then(function(something) {
    SomeOtherService.addXToDatas(something.data).then(function(fixedData) {
        $scope.data = fixedData;
    });
});

我有什么:

    someOtherService.addXToDatas = function(datas) {
        datas.forEach(function(value, index, array) {
            getSomethingFromApi(value.something).then(function(bla) {
                array[index] = bla;
            });
        });
    }
    someOtherService.addXToData = function(data) {
            getSomethingFromApi(data.something).success(function(response) {
                order.someMore = response.data;
            });
        }           
    }

不幸的是,我没有实际的线索如何在javascript中完成此操作。对于单个对象,我可以使用回调,但对于对象列表?

Angular.js内置了Q的实现,所以你可以使用promise组合Q.all。它接受一系列承诺,并返回一个承诺,当所有其他承诺都已实现时,该承诺已实现。

您可以使用 .map 而不是 .forEach 轻松地使用 Your 代码创建承诺数组:

someOtherService.addXToDatas = function(datas) {
    return $q.all( datas.map(function(value, index, array) {
            return getSomethingFromApi(value.something).then(function(bla) {
                array[index] = bla;
            });
        })).then(function() {
            return datas;
        });
}
SomeOtherService.addXToDatas(something.data).then(function(fixedData) {
    $scope.data = fixedData;
});

解释:

  1. datas.map()创造了一系列承诺。API 调用本身将异步执行。
  2. $q.all()返回一个承诺,当从 (1) 传递给它的所有承诺都得到履行时,该承诺就会实现。
  3. Final then 返回修改后的数组data。在 (1) 中的所有承诺都得到履行并且data的所有修改都已完成之后,它被称为。
如果我

理解正确,您想要一个充满来自 addXToDatas 中异步调用的数据的数组,您可以这样做:

someOtherService.addXToDatas = function(datas) {
    var promises = [];
    datas.forEach(function(value, index, array) {
        promises.push(
            getSomethingFromApi(value.something)
        );
    });
    return $q.all(promises);
}

在控制器中:

someOtherService.addXToDatas([data1, data2,data3])
    .then(function(resultArray) {
        console.log(resultArray);
    });

$q.all(promises)将返回一个包含 promise 值的数组(按顺序)。有关$q$q.all的更多信息,请单击此处。