Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数据请求有时是异步的_Javascript_Angularjs_Asynchronous_Firebase - Fatal编程技术网

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中固定