为什么不在下面的_.each循环中按顺序保存对象?

时间:2016-01-22 08:26:14

标签: javascript parse-platform

我循环遍历一个名为$scope.points的对象数组,如下所示:

[
  {"x": 200, "y": 200, "index": 0}
  {"x": 200, "y": 200, "index": 1}
  {"x": 200, "y": 200, "index": 2}
]

这是JS,它循环遍历$scope.points并使用Parse保存它们:

var createPanodatas = function() {
  console.log('POINTS:', $scope.points)
  _.each($scope.points, function(point) {
    console.log('INDEX:', point.index)
    var Panodata = AV.Object.extend('PanoramaData'),
      panodata = new Panodata()
    var json = {
      'index': point.index,
      'x': point.x,
      'y': point.y,
      'roomModelId': $scope.pano.id
    }
    panodata.save(json, {
      success: function(panodata) {
        console.log('Panodata saved.')
      },
      error: function(panodata, error) {
        console.log('Failed to create new pano object, with error message: ' + error.message)
      }
    })
  })
}

保存的项目按日期排序,但随机索引:

[
  {
    "objectId": "56a1e3dc7db2a2005a15533a",
    "index": 1,
    "roomModelId": "56a1e3d72e958a00515cfe3e",
    "createdAt": "2016-01-22T08:10:04.646Z"
  },
  {
    "objectId": "56a1e3dcc24aa8005415772f",
    "index": 0,
    "roomModelId": "56a1e3d72e958a00515cfe3e",
    "createdAt": "2016-01-22T08:10:04.646Z"
  },
  {
    "objectId": "56a1e3dc816dfa005919182b",
    "index": 2,
    "roomModelId": "56a1e3d72e958a00515cfe3e",
    "createdAt": "2016-01-22T08:10:04.670Z"
  },
]

由于console.log('POINTS:', $scope.points)以正确的索引顺序输出项目,因此让我很困惑:

enter image description here

还有console.log('INDEX:', point.index)

INDEX: 0
INDEX: 1
INDEX: 2

为什么用随机索引保存项目?如何按顺序保存索引? (例如012 ...)?

1 个答案:

答案 0 :(得分:1)

看起来这些项目保存得很好并且索引正确。

下划线_.each函数将按照您的预期顺序遍历数组,这也将导致以相同的顺序创建PanoramaData

需要注意的关键信息是,使用Parse进行保存是一个 异步 进程,您无法保证哪个实际先完成。直观地说,你会期望首先执行的保存将首先履行他们的承诺,而且可能就是这种情况,但是你仍然无法做出任何保证。

在您的示例中似乎不是这种情况,因为数据似乎保存得很好,但如果 需要 知道它们已保存在与数组完全相同的顺序,您可以使用promise chaining,特别是serial promise chaining

同样,看起来数据正确设置但创建时间引起了您的关注,因为在您的示例中索引1和0都是在2016-01-22T08:10:04.646Z创建的。除非你有特定的用例,否则尽量不要过分依赖串行进程。