数据请求有时是异步的

Data request is sometimes asynchronous

本文关键字:异步 请求 数据      更新时间:2023-09-26

这是我今天早些时候发布的一个问题的后续内容。我正在阅读这本关于在Firebase中使用AngularJS的书,这本书让我提出了这个问题。我找到了一个解决方案,但我仍然不明白的是,API文档中的$firebaseArray示例似乎没有将其作为异步请求进行处理。

var list = $firebaseArray(new Firebase(URL));
// add an item
list.$add({ foo: "bar" }).then(...);
// remove an item
list.$remove(2).then(...);
// make the list available in the DOM
$scope.list = list;

此外,书中的示例似乎也同步处理了请求。

# Service
var buildingsUri = FIREBASE_URI + '/buildings';
var ref = new Firebase(buildingsUri);
var buildings = $firebaseArray(ref);
var getBuildings = function () {
  return buildings;
};
...
# Controller
$scope.buildings = syncArraySvc.getBuildings();

当第一个例子中的$scope.list和第二个例子中$scope.buildings没有检查以确保请求已经完成时,它们是如何用数据正确填充的?

$add和$remove方法返回promise。$firebaseArray()方法返回一个添加了一些特殊函数和属性的数组。$add和$remove都不需要本地加载数据,也不需要依赖于数据的状态,因此可以同步调用它们。当然,数据仍然是异步下载的。例如:

var list = $firebaseArray(new Firebase(URL));
// add an item
list.$add({ foo: "bar" }).then(function(ref) {
   console.log('added', ref.key());
});
// remove an item
list.$remove(2).then(function(ref) {
   console.log('removed', ref.key());
});
console.log('list current contains', list.length, 'items');
list.$loaded(function() {
   console.log('after loading initial data, the list contains', list.length, 'items');
});

假设列表在加载时包含10个项目,并且在代码执行期间该列表没有远程更改,我们将看到类似于以下的输出:

list currently contains 0 items
after loading initial state, the list contains 10 items
added abc123
removed xyz456

此外,我要注意的是,这段代码可能是多余的。通常,当我们看到这样的代码时,这是因为开发人员试图将Firebase转变为CRUD模型。您可能只需要在那里返回$firebaseArray(),并使用现有的方法,如$getRecord()等,而不是在服务中人为地包装API。