我正在使用Angular facebook service 在控制器中,我试图使用方法:$ facebook.login()点击按钮,使用ng-click。
返回promise并激活内部代码,但没有登录弹出窗口。 还尝试关闭镀铬弹出窗口拦截器。 控制台上没有错误...
这是我的代码示例:
facebook.html
<div class="container">
<div class="col-md-4">
<h3>please log in</h3>
<button type="Log In" class="btn btn-default" ng-click="login()">Log In</button>
</div>
facebook.js
'use strict';
angular.module('ngsocial.facebook', ['ngRoute', 'ngFacebook'])
.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/facebook', {
templateUrl: 'facebook/facebook.html',
controller: 'facebookCtrl'
});
}])
.config(function($facebookProvider) {
$facebookProvider.setAppId('1816664965234931');
$facebookProvider.setPermissions("email", "public_profile", "user_posts", "publish_actions", "user_photos");
})
.run(function($rootScope) {
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {
return;
}
js = d.createElement(s);
js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
(function() {
console.log("im loaded");
}());
})
.controller('facebookCtrl', ["$scope" , "$facebook" , function($scope,$facebook) {
$scope.login = function () {
$facebook.login().then (console.log("promise has returned"));
}
}]);
答案 0 :(得分:0)
$facebook.login().then (console.log("promise has returned"));
并不意味着已经返回了promise ...你所做的就是将一个立即执行的console.log的返回值作为回调函数传递给.then
- 在Promises中,传入一个非作为回调函数是“什么都不做” - 例如
somePromise.then(undefined).then(function(data) {
console.log(data);
});
会记录somePromise
=已完成的值,就像.then(undefined)
甚至不存在 - 这是有原因的 - 因为在浏览器中.catch
无法使用(到期)要catch
成为保留字,你会像.then(null, function(err) { ... });
那样捕捉 - 因为.then
实际上有两个参数,有充实和有效的
如果您将代码更改为
.then(function(data) {
console.log(data);
})
.catch(function(err) {
console.log('error', err);
});
您会看到$facebook.login()
的实际结果 - 很可能会出现错误,因为您说弹出窗口没有发生
如果您想确切了解
$facebook.login()
返回的内容
var p = $facebook.login();
console.log('p is', p);
p.then(function(data) {
console.log('data is', data);
})
.catch(function(err) {
console.log('error', err);
});
如果上面的p
是承诺,那么你应该看到
p is Promise { <state>: "pending" }
在Firefox中- 其他浏览器可能会显示不同的内容
如果你看到p是一个承诺,并且.then和.catch都没有被调用,那意味着该函数返回的承诺永远不会实现