Facebook登录弹出窗口没有显示,但仍然返回一个承诺

时间:2016-09-24 08:34:40

标签: javascript angularjs facebook-graph-api

我正在使用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"));
  }
}]);

1 个答案:

答案 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都没有被调用,那意味着该函数返回的承诺永远不会实现