如果连接到我的API时出错,有人可以帮我弄清楚如何在我的AngularJS工厂中返回硬编码数据.我的硬编码数据位于另一个名为"dataFactory"的工厂中.感谢您的帮助.
service.factory("ScheduleFactory", ['$http', '$resource', '$q', 'dataFactory', function($http, $resource, $q, dataFactory) {
var objFactory = {};
objFactory.getDaysOfWeek = function(includeWeekends) {
var days = [];
var API = $resource(restURL + '/daysOfWeek/');
API.query()
.$promise
.then(function(data) {
isEmpty = (data.length === 0);
if (!isEmpty) {
days = data;
};
})
.catch(function(error) {
console.log("rejected " + JSON.stringify(error));
var data = null;
days = dataFactory.daysOfWeek;
console.log(days.length); // returns 5
});
console.log("after promise " + days.length); // returns 'after promise 0'
return days;
};
Run Code Online (Sandbox Code Playgroud)
我的dataFactory定义如下:
dataApp.factory("dataFactory", function() …Run Code Online (Sandbox Code Playgroud) 我正试图找出一种在AngularJs中链接承诺的简洁方法.我的目标是不使用$ q重写$ http承诺,而是利用$ http.xxx()方法返回promise并使用链接这一事实.在下面的代码中,我试图满足以下用例.
注意:如果我删除了内置的.catch()块,我的404将被外部catch()捕获.我尝试使用then(actionHandler,errorHandler)方法,并尝试从.catch()返回一个字符串,并尝试在.catch()中使用this.reject().
Give $scope.username is Bret
When calling getPosts() and getting a 404 from /users
Then scope.error has a message indicating that the user wasn't found
Run Code Online (Sandbox Code Playgroud)
//代码
angular.module('app', [])
.controller('MainController', function ($scope, $log, $q, $http) {
$scope.posts = [];
$scope.message = "";
function getUserByUserName(userName) {
return getUsers()
.then(function (response) {
var user;
for (var i = 0; i < response.data.length; i++) {
if (response.data[i].username === userName) {
user = response.data[i];
break;
}
}
return user;
}).catch(function (error) …Run Code Online (Sandbox Code Playgroud) 我有一个非常好的功能.我只想根据承诺返回真或假.
//I want this function to return a simple true or false!!!
function isAppOnline() {
var is_connected = connectivityMonitor.isInternetConnected();
is_connected.then(function(result) {
console.log('INTERNET_CHECK_API : app online');//works fine
return true;//this is not being returned
}, function(error) {
console.log('INTERNET_CHECK_API : app offline');//works fine
return false;//this is not being returned
});
}
Run Code Online (Sandbox Code Playgroud)
但是当我调用这个函数时,
is_online = isAppOnline();
Run Code Online (Sandbox Code Playgroud)
is_online总是未定义的.为什么函数不能返回一个简单的布尔值?
更新:
这就是我想要做的:我只是想打开一个弹出窗口,通知用户他已离线.我在10secs之后定期调用函数isAppOnline.这个功能已经在我的工厂中使用了一个承诺.我不想让事情过于复杂,但对我来说重要的是这个函数返回一个布尔值,所以基于此,我可以相应地采取行动.
我通过服务公开这个功能:
function getData(url) {
return $http.get(url).then(function (response) {
return response.data;
});
}
Run Code Online (Sandbox Code Playgroud)
如果调用成功,一切都很好 - 我得到了一个按预期解决的承诺.
如果我传入生成404的URL,我会得到:
TypeError:无法读取未定义的属性"data"
在线上: return response.data;
我可以在Chrome的开发者工具中看到GET返回404.
为什么Angular(v1.4.7,也尝试使用v1.5.0)调用我的successCallback undefined出错了?
(我想要做的是处理调用代码中的失败.)
编辑: @jcaron指出我正确的方向.问题似乎是此配置行(由另一个开发人员编写):
$httpProvider.interceptors.push('ErrorInterceptor');
Run Code Online (Sandbox Code Playgroud)
拦截器必须有一个设计缺陷:
function ErrorInterceptor($q, $window) {
return {
response: function (response) {
return response;
},
responseError: function (response) {
if (response.status === 500) {
$window.location.href = '/error';
return $q.reject(response);
}
}
};
Run Code Online (Sandbox Code Playgroud) 我试图等待3个承诺,但$q.all似乎立即解决它们并返回undefined每个单值,我无法弄清楚原因:
this.doWork = function() {
var deferred = $q.defer();
var a = get('a'),
b = get('b'),
c = get('c');
$q.all([a.promise, b.promise, c.promise])
.then(function(values) {
deferred.resolve(new Test(values[0], values[1], values[2]));
}, function(reason) {
deferred.reject(reason);
});
return deferred.promise;
};
function get(param) {
var deferred = $q.defer();
$timeout(function() {
if (true) {
deferred.resolve({
value: param
});
} else {
deferred.reject({
message: "Really bad"
});
}
}, 1000);
return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)
(在实际代码中get()使用$http而不是$timeout当然).这是一个带有代码的Plnkr,任何人都可以对这个问题有所了解吗?
我试图将getstream API包装在角度服务(工厂)中
这是我的代码:
.factory('FeedStream', function($http, $q) {
var client = stream.connect('xxxxxxxxxxx');
return {
feed : function() {
$http.get('/api/feed/auth/')
.success(function(auth) {
var user_feed = client.feed('user', auth.user, auth.token);
console.log(user_feed.get());
user_feed.get().then(function(data) {
console.log(data);
return data;
})
})
},
}
Run Code Online (Sandbox Code Playgroud)
首先,我使用端点/ api/feed/auth /从我的服务器获取user_id和auth令牌.这个数据以有角度的承诺返回.
接下来,我使用此数据调用getstream api来获取user_feed对象.如果我返回此对象(user_feed),则在控制器中未定义.如果我在服务中将其打印到控制台,则它具有正确的值.我注意到在返回后打印发生了半秒左右.为什么这个变量的赋值是异步发生的?
现在,如果我在console.log语句中调用get此user_feed对象上的方法,则会打印出一个Javascript promise对象.如果我return user_feed.get()它返回undefined控制器.如果我在上面的代码中在服务中调用它,并在promise then语句中返回数据对象,它将返回undefined到控制器.但是,如果我打印data对象,它具有正确的值.
为什么我不能从此服务返回任何对象?我错过了使用承诺的一些基本方面吗?
我正在试图将可观察的变速器ActivatedRoute转换为承诺,但没有任何运气.我已http成功将请求转换为承诺:
this.riaService.getAdvisorsForState(this.activeState)
.then(rias => {
this.riasForState = rias.json();
console.log(this.riasForState);
});
// this all works ^
Run Code Online (Sandbox Code Playgroud)
但是我无法将'activatedRoute.params'变成一个承诺:
export class InvestmentAdvisorStateComponent implements OnInit {
constructor(private activatedRoute: ActivatedRoute, private riaService: InvestmentAdvisorService) { }
getStateFromUrl() {
this.activatedRoute.params
.toPromise()
.then(params => {
console.log('HERE',params)
});
}
// this does not work for me ^
Run Code Online (Sandbox Code Playgroud)
这就是我现在所拥有的:
getStateFromUrl() {
this.activatedRoute.params
.subscribe((param: any) => {
this.activeState = param['state'];
});
}
// works ^
Run Code Online (Sandbox Code Playgroud)
我希望将此作为一种承诺来实现,所以我可以.then脱离它.任何有关如何做到这一点的帮助非常感谢.
我正在尝试使用Pinterest JavaScript SDK来获取项目的一些引脚数据.我在我创建的Pinterest服务中有一个方法可以在我的HomeController中调用.我尝试在响应中抛出响应,所以我可以将它放在我的HomeController上$scope并在我的视图中显示它.但是,在我看来,$ scope.pins是未定义的.为什么undefined?似乎承诺正在发挥作用.还在学习承诺.
function getBoardPins (id) {
return new Promise(function (resolve, reject) {
PDK.request('/v1/boards/' + id + '/pins/', 'GET', {fields: 'id,link,url,creator,board,created_at,note,color,counts,media,attribution,image,metadata'}, function (response) {
if (response) {
resolve(response);
}
reject();
});
});
}
Run Code Online (Sandbox Code Playgroud)
Pinterest.getBoardPins('490329546869188172').then(function (response) {
$scope.pins = response.data;
});
Run Code Online (Sandbox Code Playgroud)
<h1>Pinterest</h1>
<div ng-repeat="pin in pins">
<div>{{pin}}</div>
</div>
Run Code Online (Sandbox Code Playgroud) 在我的Angular 2应用程序中成功实现gapi客户端后,我现在遇到一个问题,我的http对象未定义,我不知道为什么.
下面是代码:constructor(private http:Http){}
initGmailApi() {
gapi.auth2.getAuthInstance().grantOfflineAccess().then(function(resp) {
console.log(resp);
const auth_code = resp.code;
const body = {'AuthCode': auth_code};
const headers = new Headers();
headers.append('Content-Type', 'application/json');
this.http.post('http://localhost:8080/startgmail', body, headers).subscribe(
(Response) => {
console.log(Response);
}
);
});
}
Run Code Online (Sandbox Code Playgroud)
基本上我正在做的是请求用户允许访问他的Gmail帐户,当我有响应时,我想将收到的一些数据传递给我的后端服务器.
如果我在"then"子句之外使用this.http,那么http方法可以正常工作,但这会产生另一个无法识别"auth_code"值的问题.
我在这里错过了什么?
我试图从我的firestore数据库中获取用户列表,并确定登录用户是否是管理员(即他在列表中).
这是我的代码:
isAdmin(user: any): boolean {
var col = this.afs.collection('admins');
var docRef = col.doc('mini-admins');
docRef.ref.get().then(function (doc) {
if (doc.data().user == user)
return true;
}).catch(function (error) {
console.log("Error getting document:", error);
});
return false;
}
Run Code Online (Sandbox Code Playgroud)
但是,即使用户是管理员,该功能也不起作用.在继续之前,它似乎没有等待它完成.
我该如何解决?
angular-promise ×10
angularjs ×7
javascript ×7
promise ×5
angular ×3
ajax ×1
asynchronous ×1
getstream-io ×1
html ×1
ionic ×1
observable ×1
typescript ×1