标签: angular-promise

我可以在Angular组件之外使用AngularJS的$ q吗?

我正在编写一个浏览器应用程序,我有一个创建对象并初始化它的文件.该应用程序是用AngularJS编写的,但有问题的文件是Angular生态系统之外的纯Javascript.

我想在文件中使用的承诺,但由于角包含一个实现Q,我宁愿只使用比其他图书馆带来的.

我也在使用RequireJS.

那么,有没有办法在非Angular文件中使用$ q?

javascript requirejs angularjs angular-promise

6
推荐指数
1
解决办法
2065
查看次数

等待$ rootScope值在页面加载之前在Angular中解析

所以我遇到了这个问题,我正在使用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)

javascript angularjs angular-promise

6
推荐指数
1
解决办法
7170
查看次数

如何将$ q传递给angular指令链接函数?

我需要使用$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)

javascript angularjs angularjs-directive angular-promise

6
推荐指数
1
解决办法
3980
查看次数

Angular $ q.reject().success(),这有意义吗?

我正在读一本名为MEAN Machine的书,当我进入后期章节时,我已经陷入其中一个示例应用程序,这似乎不起作用.

问题似乎发生,因为我的mainController调用authServiceAuth.getUser()方法,它可能返回a $http.get()或a $q.reject().由于我没有登录,它会返回$q.reject(),并且无法链接.success()承诺.

它抛出以下异常:

TypeError:undefined不是mainCtrl.js中的函数:13

我的代码如下.


CONTROLLER
mainController

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)

javascript promise angularjs angular-promise

6
推荐指数
1
解决办法
556
查看次数

有条件的有条件承诺

对于一个有角度的项目,我必须嵌套承诺,我遇到了我不确定我在做什么的情况.这是我的一个代码:

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)

promise angularjs angular-promise

6
推荐指数
1
解决办法
3954
查看次数

q.all不为多重承诺工作

我有以下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的简单实现不起作用..任何帮助将不胜感激.

angularjs angularjs-scope angular-promise

6
推荐指数
2
解决办法
1万
查看次数

Angular链中的可选第一个承诺

我有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)

链接这两个调用的正确语法是什么,第一个是可选的?

angularjs angular-promise

6
推荐指数
1
解决办法
673
查看次数

AngularJS承诺数组

任何人都可以帮我一些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)

angularjs angular-promise

6
推荐指数
1
解决办法
9704
查看次数

使用google工作表API时Angular 1.6 $ http.jsonp

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

6
推荐指数
1
解决办法
434
查看次数

在promise.all中为每个promise设置超时

我能够成功执行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)

javascript angularjs bluebird es6-promise angular-promise

5
推荐指数
1
解决办法
3403
查看次数