2016-09-24 86 views
0

我在控制器中使用Angular facebook service 我試圖使用方法:$ facebook.login()單擊按鈕時,使用ng-單擊。Facebook的登錄彈出窗口不顯示,但仍然返回一個承諾

承諾被退回,裏面的代碼被激活,但沒有登錄彈出窗口。 也試圖關閉Chrome彈出窗口阻止程序。 有控制檯上沒有錯誤...

這裏是我的代碼示例:

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
$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實際上需要兩個參數,onfulfilled和onrejected

如果你改變你的代碼

.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是一個承諾,無論是。那麼也沒有。 catch被稱爲,這意味着由該函數返回的承諾永遠不會滿足

+0

感謝您的快速回復。但是...仍然沒有錯誤...這一次,它不是打印承諾內的內容.... .controller('facebookCtrl',[「$ scope」,「$ facebook」,function($ scope,$ Facebook)的{ $ scope.login =函數(){$ facebook.login(),然後(功能(數據)。{ 的console.log(數據); }) .catch(函數(ERR){ 控制檯。日誌('錯誤',錯誤); }); } } – LiranC