角度承诺未正确解析
angular promise not resolving correctly
本文关键字:承诺 更新时间:2023-09-26
我正在努力获得在Firebase查询后解决的承诺。 本质上,我想从一个表中获取所有指定的键,然后遍历另一个表以获得我想要的艺术品。
艺术家工厂.js
'use strict';
angular.module('artvoicesApp')
.factory('Artist', function(localStorageService, FIREBASE_URL, $q) {
var artistData = {};
var userKey = localStorageService.get('userKey');
var accountKey = localStorageService.get('accountKey');
var artistRef = FIREBASE_URL.child('v2/artist');
var accountRef = FIREBASE_URL.child('v2/account/' + accountKey);
var userRef = FIREBASE_URL.child('v2/user/' + userKey);
artistData.addArtist = function(artistName) {
var artist = artistRef.push();
accountRef.child('artists/' + artist.key()).set(true);
userRef.child('artists/' + artist.key()).set(true);
artist.set({name: artistName});
artist.child('users/' + userKey).set(true);
artist.child('accounts/' + accountKey).set(true);
};
artistData.getArtistKeys = function() {
var artistKeys = [];
var defer = $q.defer();
accountRef.child('artists').once('value', function(snapshot) {
snapshot.forEach(function(childSnapShot) {
artistKeys.push(childSnapShot.key());
});
defer.resolve(artistKeys);
});
return defer.promise;
};
artistData.getArtists = function(artistKeys) {
var artistObj = {};
var artistRef = FIREBASE_URL.child('v2/artist');
var defer = $q.defer();
artistKeys.forEach(function(artist) {
artistRef.child(artist).once('value', function(snapshot) {
artistObj[artist] = snapshot.val();
});
defer.resolve(artistObj);
});
return defer.promise;
};
return artistData;
});
艺术品.控制器.js
Artist.getArtistKeys().then(function(artistKeys) {
Artist.getArtists(artistKeys).then(function(artists) {
vm.artists = artists;
console.log(vm.artists);
});
});
如果我将 vm.art 设置为超时,它会返回相应的数据。
这是你的问题:
artistKeys.forEach(function(artist) {
artistRef.child(artist).once('value', function(snapshot) {
artistObj[artist] = snapshot.val(); // <<== This is called second, at an unspecified time in the future
});
defer.resolve(artistObj); // <<== This is called first
});
您artistObj
的所有分配都将在您调用defer.resolve(artistObj)
后的某个时间发生。这就是为什么一旦您添加超时,它似乎就可以工作的原因。
您需要将您的艺术家收藏映射到承诺集合,然后等待所有这些承诺得到解决。
artistData.getArtistKeys = function(artistKeys) {
var artistObj = {};
var artistRef = FIREBASE_URL.child('v2/artist');
var allPromises = artistKeys.map(function(artist) {
var childDefer = $q.defer();
artistRef.child(artist).once('value', function(snapshot) {
artistObj[artist] = snapshot.val();
childDefer.resolve();
});
return childDefer.promise();
});
// allPromises is now an array of promises
var defer = $q.defer();
$q.all(allPromises).then(function() {
defer.resolve(artistObj);
});
return defer.promise();
}
相关文章:
- 我的职位回报太快了,如何做出承诺
- 打破承诺链的好方法是什么
- 从函数返回角度承诺
- 我怎样才能获得承诺的价值
- 延期承诺值未更新/解析/延期
- 在承诺链中处理早期回报的最佳方式
- 承诺在非节点式回调上使用Bluebird
- 简单的ES6承诺问题-交换解决和拒绝参数
- 组合承诺和非承诺值
- 带有对象/原型的链式承诺(Q延期)
- AngularJS$q承诺使用socket.io
- React JS:未捕获(在承诺中)语法错误:在位置 0 的 JSON 中意外<令牌
- 当一些承诺失败时,如何继续使用$q.all()
- Nodejs和express路由,如何处理客户端的承诺
- 如何在多承诺链中处理谷歌地图API V3事件
- 承诺合并流
- JavaScript承诺-无法读取属性'那么'的未定义
- 等待循环调用的所有承诺完成
- Pg承诺性能提升:在冲突中
- 如何判断请求/承诺是否需要超过5秒才能完成,angular js