Javascript 数据请求有时是异步的
这是我今天早些时候发布的一个问题的后续。我正在通过,这使我的职位。我找到了一个解决方案,但我仍然不明白的是,中的示例似乎没有将其作为异步请求处理Javascript 数据请求有时是异步的,javascript,angularjs,asynchronous,firebase,Javascript,Angularjs,Asynchronous,Firebase,这是我今天早些时候发布的一个问题的后续。我正在通过,这使我的职位。我找到了一个解决方案,但我仍然不明白的是,中的示例似乎没有将其作为异步请求处理 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 t
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
在未检查以确保请求已完成时如何正确填充数据?添加和删除方法返回承诺。$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。我假设firebase正在返回$q承诺。在请求完成后,这些文件通常会被更新,以包含结果。当摘要运行时,视图将使用所述数据进行更新。@KevinB我想我在跟踪。基于,
$firebaseArray()
必须包装然后
和其他回调,以便返回请求的数据,而不需要在客户端代码中进行回调,这听起来正确吗?不,我很确定它只是返回了$q承诺。可以肯定的是,您在上面看到的不仅仅是您的数据。它不能仅仅更新var以包含其他内容,它仍然是它返回给您的任何基本对象。有人评论说,使用console.log
调试AngularFire数据不是一个好主意。我理解$add
和$remove
方法,因为它们使用的标准承诺语法。在您的示例中,您将$loaded
与list
一起使用,但是如果您将list
分配给作用域,例如,使用$scope.list=list
,它将正确呈现列表项。即使将console.log
放在该赋值之后,也会返回一个空数组。这是我没有得到的。在本地下载数据之前,它将是空的。另外,在1.1.0和1.1.1版本中使用$extend时,$loaded方法中存在一个bug。它在1.1.2中固定