Javascript 使用asycronus数据修改数组

Javascript 使用asycronus数据修改数组,javascript,angularjs,Javascript,Angularjs,我有一个非常奇怪的问题,我相信世界上有人已经弄明白了。不过,让我们保持简单。好了,开始吧 所以我有一个简单的对象数组。现在让我们假设5个对象 [{id: 1, data: 'stuff'}, {id: 2, data: 'stuff'}, {id: 3, data: 'stuff'}, {id: 4, data: 'stuff'}, {id: 5, data: 'stuff'}] 然后我做的是发出3个ajax请求,显然,所有请求都会返回,并在不同的时间返回。我要做的是根据id更新此数组。例如,

我有一个非常奇怪的问题,我相信世界上有人已经弄明白了。不过,让我们保持简单。好了,开始吧

所以我有一个简单的对象数组。现在让我们假设5个对象

[{id: 1, data: 'stuff'}, {id: 2, data: 'stuff'}, {id: 3, data: 'stuff'}, {id: 4, data: 'stuff'}, {id: 5, data: 'stuff'}]

然后我做的是发出3个ajax请求,显然,所有请求都会返回,并在不同的时间返回。我要做的是根据id更新此数组。例如,我发送3个ajax请求并接收对象1、2和4的新数据。我需要更新数组中的Perspectives对象中的数据属性。我正在使用Array.splice进行更新。我发现有些时候,由于数据在不同的时间出现,因此无法正确更新。我认为这是因为splice实际上是从数组中删除对象,然后在以后重新插入新数组。当拼接方法处于移除对象的中间时,有时会出现另一个响应,并试图删除另一个对象,但是,对象没有在正确的索引中,因为第一个对象已经被移除,还没有被插入。因此,更新已关闭。

您根本不需要更改数组,您只是尝试更新数组中的对象。此外,索引应该无关紧要,因为您使用的是
id
属性来唯一标识每个对象,而不是数组中的索引


您应该使用对数组最容易循环的方法,找到具有相应
id
的对象并对其进行更新。

这可以通过循环每个对象并保留对该对象的引用来轻松处理,以便您可以在每个请求完成时更新每个对象

var promiseArr = dataArr.map(function (obj) {
    return $http.get('/data/' + obj.id).then(function (result) {
        obj.data = result.data;
    });
});

// optional...
$q.all(promiseArr).then(function () {
    console.log('all done!');
});

你是说“异步”吗?你真的不想要变异。您可以尝试使用promises,使用
Promise.all
,然后回调将在所有请求完成后公开它们的结果。@elclars我考虑过这一点,但我不想等待所有请求进入。这是我正在开发的可视化应用程序,因此一些请求可能很快,而其他请求可能需要更长的时间。我不希望用户必须等待最长的请求才能完成。我希望他们进来时能看到回应。