Bài viết sau tạo một wrapper để sử dụng Facebook API theo phong cách JavaScript ES7 dùng async/await, giúp mã nguồn ứng dụng Facebook trở nên gọn gàng hơn.

Dưới đây là trái tim của chương trình 🙂 – class AsyncFB. Class này sẽ thay thế các API trong FB object của Facebook JavaScript SDK với phiên bản tương đương hỗ trợ Promise và async/await.
AsyncFB.js
'use strict';
class AsyncFB {
// Singleton
static getInstance() {
if ( !AsyncFB.instance )
AsyncFB.instance = new AsyncFB();
return AsyncFB.instance.getScript();
}
// Load the Facebook JavaScript SDK
getScript() {
let inst = this;
return new Promise((resolve) => {
if (this.FB) {
resolve(inst);
} else {
window.fbAsyncInit = function() {
Object.assign(inst, {
// Event Handling Methods
Event: window.FB.Event,
// App Events
AppEvents: window.FB.AppEvents,
// XFBML Methods
XFBML: window.FB.XFBML,
// Canvas Methods
Canvas: window.FB.Canvas,
// Facebook Object
FB: window.FB
});
resolve(inst);
};
(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 = "https://connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
}
});
}
// Initialize and setup the SDK
init(params) {
return new Promise((resolve) => {
console.log('FB.init(', params, ')');
this.FB.init(params);
resolve(this);
});
}
// Make an API call to the Graph API
api(...params) {
return new Promise((resolve) => {
const callback = (response) => {
console.log('FB.api(', params,') = ', response);
resolve(response);
};
params.push(callback);
this.FB.api(...params);
});
}
// Trigger different forms of Facebook created UI dialogs,
// such as the Feed dialog, or the Requests dialog.
ui(params) {
return new Promise((resolve) => {
this.FB.ui(params, (response) => {
console.log('FB.ui(', params,') = ', response);
resolve(response);
});
});
}
// Returns the Facebook Login status of a user.
getLoginStatus() {
return new Promise((resolve) => {
this.FB.getLoginStatus((response) => {
console.log('FB.getLoginStatus() = ', response);
resolve(response);
});
});
}
// Prompts a user to login to your app using the Login dialog in a popup.
login(params = { scope: 'public_profile,email' }) {
return new Promise((resolve) => {
this.FB.login((response) => {
console.log('FB.login(', params,') = ', response);
resolve(response);
}, params);
});
}
// Logout the current user both from your site or app and from Facebook.com.
logout() {
return new Promise((resolve) => {
this.FB.logout((response) => {
console.log('FB.logout() = ', response);
resolve(response);
});
});
}
// Return the authResponse object without the overhead of an asynchronous call
getAuthResponse() {
console.log('FB.getAuthResponse()');
return this.FB.getAuthResponse();
}
}
Cách sử dụng
Đoạn mã sau demo cách sử dụng class AsyncFB và Facebook API với async / await. Hãy thay thế {app-id} bằng App ID của bạn và {api-version} bằng phiên bản Graph API đang sử dụng – hãy luôn sử dụng phiên bản mới nhất nhé.
<!DOCTYPE html>
<html>
<head>
<title>Facebook Login JavaScript Example</title>
<meta charset="UTF-8">
</head>
<body>
<div id="status"></div>
<script src="AsyncFB.js"></script>
<script>
(async function() {
// Obtain the instance of async Facebook API
let FB = await AsyncFB.getInstance();
await FB.init({
appId: '{app-id}',
version: '{api-version}',
cookie: true, // Enable cookies to allow the server to access the session.
xfbml: false, // Parse social plugins on this webpage.
});
let authResponse = await FB.getLoginStatus();
// Attempt to login
if ('connected' !== authResponse.status)
authResponse = await FB.login({ scope: 'public_profile,email' });
if ('connected' !== authResponse.status) {
document.getElementById('status').innerHTML =
'Failed to log in!';
return;
}
// Fetching your information using Graph API
let response = await FB.api('/me');
document.getElementById('status').innerHTML =
'Thanks for logging in, ' + response.name + '!';
})();
</script>
</body>
</html>








