所以我遇到了这个问题,我正在使用ngView,我有一个静态的导航栏,如下所示:
<div ng-include="'views/nav.html'" ng-controller="NavCtrl"></div>
<div class="container-fluid" ng-view=""></div>
Run Code Online (Sandbox Code Playgroud)
如果用户已注销(使用ng-show),则此nav.html(导航栏)显示一组特定功能(登录,注册),如果用户已登录,则显示其他菜单选项.由于当前大量使用用户,我把这些信息放在$ rootScope中,如下所示:$rootScope.currentUser- 返回用户对象,并$rootScope.signedIn返回布尔值.
基本上,我想延迟导航加载直到$rootScope.signedIn加载,无论是真还是假,并且$rootScope.currentUser是一个对象或未定义.
我已经尝试过在我的app.config路由中创建promises,但我不确定如何返回对永久视图状态的promise.
任何帮助表示赞赏.
编辑:
这是我广播登录的服务.只要用户通过身份验证/登录或注销时,就会触发此消息:
var authClient = new FirebaseSimpleLogin(refDownload, function(error, user) {
if (error) {
incorrectLogin(error.code);
}
if (user) {
// user authenticated
$rootScope.$broadcast('login');
correctLogin(user.id);
} else {
// user is logged out
$rootScope.$broadcast('logout');
}
});
Run Code Online (Sandbox Code Playgroud)
此服务以下列方式注入NavCtrl控制器:
$scope.isHidden = true;
$scope.$on('login', function() {
console.log('login broadcast');
$scope.isHidden = false;
});
$scope.$on('logout', function() {
console.log('broadcast logout');
$scope.isHidden = true;
});
Run Code Online (Sandbox Code Playgroud)
该控制器的模板是nav.html,如下所示:
<div …Run Code Online (Sandbox Code Playgroud) 我需要使用$q一个link我的指令的功能.我需要它来包装由一个参数重新调整的可能的promise(参见下面的例子).但是我不知道如何将$q依赖关系传递给这个函数.
angular.module('directives')
.directive('myDirective', function() {
return {
scope: {
onEvent: '&'
}
// ...
link: function($scope, $element) {
$scope.handleEvent() {
$q.when($scope.onEvent()) {
...
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在读一本名为MEAN Machine的书,当我进入后期章节时,我已经陷入其中一个示例应用程序,这似乎不起作用.
问题似乎发生,因为我的mainController调用authService的Auth.getUser()方法,它可能返回a $http.get()或a $q.reject().由于我没有登录,它会返回$q.reject(),并且无法链接.success()承诺.
它抛出以下异常:
TypeError:undefined不是mainCtrl.js中的函数:13
我的代码如下.
CONTROLLERmainController
angular.module('mainCtrl', [])
.controller('mainController', function($rootScope, $location, Auth) {
var vm = this;
// check to see if a user is logged in on every request
$rootScope.$on('$routeChangeStart', function () {
vm.loggedIn = Auth.isLoggedIn();
// get user information on route change
Auth.getUser()
/* ========= PROBLEM HERE ========= */
.success(function (data) {
vm.user = data;
});
});
// ... other …Run Code Online (Sandbox Code Playgroud) 对于一个有角度的项目,我必须嵌套承诺,我遇到了我不确定我在做什么的情况.这是我的一个代码:
return Action1().then(function (data) {
var defer = $q.defer();
if (data.condition) {
$q.all([Action2(), Action3(), Action4()]).then(function () {
defer.resolve();
});
} else {
defer.reject("error_code");
}
return defer.promise;
});
Run Code Online (Sandbox Code Playgroud)
Action1,Action2,Action3和Action4正在使用promises函数.这是很多承诺和行动取决于条件.我可以这样做,并确保我的主要功能将始终被解决或拒绝?
我读到我们可以在promise函数中传递promise.我可以这样做,这与上面相同:
return Action1().then(function (data) {
var defer = $q.defer();
if (data.condition) {
defer.resolve($q.all([Action2(), Action3(), Action4()]);
} else {
defer.reject("error_code");
}
return defer.promise;
});
Run Code Online (Sandbox Code Playgroud) 我有以下q.all呼吁解决两个承诺.我检查了所有帖子并尝试了所有其他实现方式q.all及其相同的情况
var xyzdeffered = $q.defer();
service1.getServiceDetail1($routeParams.id).then(function(promise) {
xyzdeffered.resolve(promise);
});
var abcdeffered = $q.defer();
service2.getServiceDetail2($routeParams.id).then(function(promise) {
abcdeffered.resolve(promise);
});
$q.all([ xyzdeffered, abcdeffered ]).then(function(data) {
$scope.variable = data;
});
Run Code Online (Sandbox Code Playgroud)
我期待q.all中的变量只有在前两个promise被解析后才能填充.但不幸的是,服务调用本身并没有返回数据,控件转移到q.all.我发现这很奇怪,因为根据文档,仅当您的承诺以200响应返回并且已解决时才会调用q.all.我检查了网络调用的分析,并发出一些警告,看看代码的顺序,发现q.all警报是第一个被弹出的警报,然后其他的promises被解决了.它真的让我生气,为什么q.all的简单实现不起作用..任何帮助将不胜感激.
我有2个$ http调用返回promises,但第一个是可选的.我相信我必须首先创建一个承诺,$q.defer()但我错过了一些东西.
这是我的非工作尝试:
var p = $q.defer();
if (condition) {
p = p.then(doOptionalFirst());
}
return p.then(doOther());
Run Code Online (Sandbox Code Playgroud)
链接这两个调用的正确语法是什么,第一个是可选的?
任何人都可以帮我一些Angular的承诺吗?我有以下函数应该接受一个文件对象数组,迭代它们,并上传每一个.在每次迭代期间,promise对象被推送到一个数组promises.在我的upload函数中,我有一个附加的cycle函数,在.then()所有的promise对象都已解析之前不应该调用它.我认为我的代码看起来是正确的,但它无法正常工作.图像上传,但是cycle(files).then()会立即调用,而不是一旦promises数组结算.
function upload(files) {
var uploadCount = files.length;
function cycle(files) {
var promises = [];
for (var i = 0; i < files.length; i++) {
var deferred = $q.defer();
promises.push(deferred);
var file = files[i];
Upload.upload({
url: '/photos.json',
file: file
}).success(function(){
$scope.progressCurrentCount += 1;
deferred.resolve();
});
};
return $q.all(promises);
};
cycle(files).then(function(result) {
if(uploadCount > 1) {
$scope.lastAction = 'uploaded ' + uploadCount + ' photos';
} else {
$scope.lastAction …Run Code Online (Sandbox Code Playgroud) Angular 1.6的$ http.jsonp与google sheet的API不太搭配:
我正在尝试从谷歌工作表中获取并获取我的数据,具体如下:
var callback;
app.controller("meetingsTable", function ($scope, $http, $sce) {
var url = "http://spreadsheets.google.com/a/google.com/tq";
var trustedUrl = $sce.trustAsResourceUrl(url);
var key = 'MY_KEY';
var tq = 'select%20*%20limit%2010';
var tqx = 'responseHandler:callback';
var params = {
key: key,
tq: tq,
status: 'ok',
tqx: tqx
};
callback = function (response) {
console.log(response); // entering here, not to the promise
return response;
}
$http.jsonp(trustedUrl, { params: params }).then(function (response) {
console.log(response);
retrun;
//success things go here
}, function (response) {
//error …Run Code Online (Sandbox Code Playgroud) javascript jsonp angularjs angular-promise google-sheets-api
我能够成功执行Promise.all,并且优雅地处理解析和拒绝.但是,有些承诺会在几毫秒内完成,有些可能/可能需要一段时间.
我希望能够为Promise.all中的每个promise设置超时,因此它可以尝试最多花费5秒.
getData() {
var that = this;
var tableUrls = ['http://table-one.com','http://table-two.com'];
var spoonUrls = ['http://spoon-one.com','http://spoon-two.com'];
var tablePromises = that.createPromise(tableUrls);
var spoonPromises = that.createPromise(spoonUrls);
var responses = {};
var getTableData = () => {
var promise = new Promise((resolve, reject) => {
Promise.all(tablePromises.map(that.rejectResolveHandle))
.then((results) => {
responses.tables = results.filter(x => x.status === 'resolved');
resolve(responses);
});
});
return promise;
};
var getSpoonData = () => {
var promise = new Promise((resolve, reject) => {
Promise.all(spoonPromises.map(that.rejectResolveHandle))
.then((results) => {
responses.tables = results.filter(x …Run Code Online (Sandbox Code Playgroud) angular-promise ×10
angularjs ×10
javascript ×6
promise ×2
bluebird ×1
es6-promise ×1
jsonp ×1
requirejs ×1