当前位置: 首页 > 知识库问答 >
问题:

链接promise,或者一个promise触发另一个promise

孔永年
2023-03-14

  app.factory('GeolocationService',function($q,$window,$rootScope){
        return {
            getLatLon: function(){
                var deferred = $q.defer();
                if(!window.navigator){
                    $rootScope.$apply(function(){
                        deferred.reject(new Error("Geolocation not available"));
                    });
                } else {
                    $window.navigator.geolocation.getCurrentPosition(function(position){
                        $rootScope.$apply(function(){
                            deferred.resolve(position);
                        });
                    }, function(error){
                        $rootScope.$apply(function(){
                            deferred.reject(error);
                        });
                    });
                }

                return deferred.promise;
            }
        };
    });

    app.factory("WeatherService", function ($q,$http,$rootScope, GeolocationService) {
        return {
            getWeather: function(){
                var weather;
                var loc = new GeolocationService.getLatLon(); 
                var  lat= loc.lat || 37.4568202221774, 
                lon= loc.lon || -122.201366838789 ;
                var units = '';
                var url = 'http://api.openweathermap.org/data/2.5/forecast/daily?lat='+lat+'&lon='+lon+'&units='+units+'&callback=JSON_CALLBACK';
                $http.jsonp(url)
                    .success(function(data) {
                        weather=data;
                        return weather;
                    })
                    .error(function(err){
                        weather=err;
                        return err;
                    });
            }

        };
    });

共有1个答案

涂承运
2023-03-14

你只需要在你的服务中使用promise,然后使用promise。对于示例,我有一个具有user.company_id的用户,如果我想获得公司的名称,我必须等待该用户被加载。和你的情况一样。

这是我的服务:

    angular.module('UserService', []) 
.factory('UserService', function($q , $http, $rootScope,$timeout) {
var currentUserPromise = null;
var currentCompanyPromise = null;
return {
    getCurrentUser: function() {
        if (currentUserPromise === null) {
            var config = {};
            config.cache = true;
            config.method = "GET"; 
            config.url = "users/get_current_user";
            currentUserPromise = $http(config)
                .then(function(response) {
                    if (typeof response.data === 'object') {
                        return response.data.user;
                    } else {
                        // invalid response
                        return $q.reject(response.data);
                    }  
                }, function(response) {
                    // something went wrong
                    return $q.reject(response.data);
                });
        }
        return currentUserPromise;
    },

    getCurrentCompany: function(company_id) {
        if (currentCompanyPromise === null){
            var config = {};
            var company = {};
            company.id = company_id; 
            config.cache = true;
            config.method = "GET"; 
            config.url = "/companies/show";
            config.params = company;
            currentCompanyPromise = $http(config)
                .then(function(response) {
                    if (typeof response.data === 'object') {
                        return response.data.company;
                    } else {
                        // invalid response
                        return $q.reject(response.data);
                    }

                }, function(response) {
                    // something went wrong
                    return $q.reject(response.data);
                });
            }
            return currentCompanyPromise;

        }
    };     
});

在我的控制器中,我这样使用:

var promiseCurrentUser = UserService.getCurrentUser();
promiseCurrentUser.then(function(user) {
    $scope.currentUser = user;
    UserService.getCurrentCompany(user.company_id).then(function(company){
        $scope.companyName = company.name;
    });
});
 类似资料:
  • 考虑以下以串行/顺序方式读取文件数组的代码。返回一个promise,该promise仅在按顺序读取所有文件后才解析。 上面的代码可以工作,但我不喜欢必须为事情按顺序发生而做递归。有没有更简单的方法可以重写这段代码,使我不必使用我怪异的函数? 最初,我尝试使用,但这导致所有调用并发发生,这不是我想要的:

  • 问题内容: 我的整个项目都使用(Bluebird)Promises,但是有一个使用EventEmitter的特定库。 我想要实现以下目标: 我在Promises链中读了EventEmitter的答案。这给了我一种执行’connect’事件的回调的方法。这是我到目前为止所到之处 现在如何进一步链接“ eventB”? 问题答案: 我假设您想为每个事件做不同的事情。即使由的动作触发,您也可以将其视为另

  • 我们回顾一下 简介:回调 一章中提到的问题:我们有一系列的异步任务要一个接一个地执行 — 例如,加载脚本。我们如何写出更好的代码呢? Promise 提供了一些方案来做到这一点。 在本章中,我们将一起学习 promise 链。 它看起来就像这样: new Promise(function(resolve, reject) { setTimeout(() => resolve(1), 1000

  • 问题内容: 如果我有:和 如果调用,我是否可以通过这种方式将linkedlist2附加到linkedlist1的末尾: 它变为并 变为? 那可能吗 ?还是我需要其他结构? 以下代码不起作用: 输出: 问题答案: Java提供的标准LinkedList类缺少此功能。 正如Donal Boyle所发布的那样,您可以将一个列表的内容添加到另一个列表中,但这并不能像您所描述的那样保持链接。

  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise 当.then()缺少返回promise对象的适当函数时,处理将继续到链的下一个链接。因此,链可以安全地忽略每个HandlerRejection,直到final.catch()。类似地,.catch()实际上只是一个.the

  • 我试图通过在本书的练习中创建promise.all方法来理解promise是如何工作的:https://eloquentjavascript.net/11_async.html#i_ug+dv9mmsw 我尝试遍历作为方法本身参数给出的整个数组,使用。然后对于成功的promise,处理程序的主体将结果推送到我以前在循环外定义的绑定,对于拒绝的promise,我使用。catch的方式是,它将拒绝的值