1

杂项

分页功能,限制和下一页

作为全部结果的子集,响应必然会提供一个response.paging.next属性。这个属性可以塞回hello.api,以取得结果的下一页。

在下面的示例中,函数paginationExample()调用了hello.api("me/frields")。后续的调用从resp.paging.next中取得path。

javascriptfunction paginationExample(path) {
    hello('facebook')
        .api(path, {limit: 1})
        .then(
            function callback(resp) {
                if (resp.paging && resp.paging.next) {
                    if (confirm('Got friend ' + resp.data[0].name + '. Get another?')) {
                        // Call the API again but with the 'resp.paging.next` path
                        paginationExample(resp.paging.next);
                    }
                }
                else {
                    alert('Got friend ' + resp.data[0].name);
                }
            },
            function() {
                alert('Whoops!');
            }
        );
}

paginationExample('me/friends');

scope

scope属性定义了应用需要从网络提供者那边取得哪些特权。通过hello.init(object,{scope:'string'}),scope可以被定义为会话全局性的,而hello('network').login({scope:'string'});只在触发身份验证时可用。

每个应用可以指定多个scope,可以用逗号隔开,如下所示:

javascripthello('facebook').login({scope: 'friends,photos,publish'});

scope与API请求是紧密耦合的,当会话缺失,或者不可用时,它将断开。

下表描述了HelloJS曝露的默认scope。可以添加额外的scope以增加专有服务。但是必须小心不要混用专用scope和你不知道如何使用的其他服务。

scope description
default 读取基本个人信息
"friends" 读取朋友的个人信息
"photos" 读取用户相册以及图片
"files" 读取用户文件
"publish" 发布状态更新
"publish_files" 发布图片和文件

把使用限制在一个scope里是个良好的作法,而且还让用户意识到为什么你的应用程序需要某些特权。当用户需要用你的应用的更多功能时,再尝试更新授权。举个例子,如果用户想把一个链接分享给朋友,包括一个用户必须点击的按钮,以触发scope为"feiends"的hello.login,然后在验证身份之后处理器触发API调用。

错误处理

hello.api([path]).then(null,[errorHandler])能够返回错误信息。或者使用hello.api([path],[handlesuccessOrError])

Promise响应标准化了error处理器的绑定。

错误对象

一个失败请求的errorHandler对象的第一个参数,可能是boolean(false),也可能是一个Error Object。

Error Object对象的结构:{code:string,message:string}。

  • code:Code,required
  • message:Error message,required

扩展服务

添加到HelloJS的服务是模块化的。欲知更多关于创建你自己的模块的信息和示例,请看Modules

OAuth代理

|方法|网站
|OAUTH2:隐式授权服务,不需要服务器端授权|windows、google、facebook、Instagram、soundcloud、foursquare|
|OAUTH2:显式授权服务,服务必需oauth_proxy|windows、google、facebook、Instagram、linkedin、soundcloud、foursquare、github|
3.OAUTH1 & 1A:服务必需oauth_proxy|dropbox、twitter、yahoo、fickr|

对于只支持OAuth1或者OAuth2显式授权的服务提供者,身份验证流必须用一个密钥才能登入,这个密钥可能不会曝露在浏览器中。HelloJS用oauth_proxy定义了一个中间媒介,通过这个Web服务,HelloJS规避了这个问题。必须向这项服务提供一个anaccess_token,这项服务从数据库查找密钥并执行握手。如果是用OAuth1,网站服务器还登入了后续的API请求。

快速起步:在OAuth代理服务器上注册你的ClientID以及密钥。

这个默认的代理服务是https://auth-server.herokuapp.com/。开发员可以把他们自己ClientID以及密钥添加到服务器上,从而启动并运行。

另一种办法是用node-oauth-shim重新创建这个服务,然后在HelloJS客户端脚本hello.init中中覆盖默认的oauth_proxy,如下所示:

javascripthello.init(
    CLIENT_IDS,
    {
        oauth_proxy: 'https://auth-server.herokuapp.com/proxy'
    }
)

Promises A+

异步方法hello.loginhello.logout以及hello.api的响应返回了一个可延迟的方法,就是Promise A+兼容。

如果你把库绑定在“src/*”文件里,请看这个promises-demo以了解更多。

浏览器支持

HelloJS瞄准所有的现代浏览器。

填充物包含在“scr/hello.polyfill.js”中,它提供了旧浏览器兼容功能。如果你使用了放在“dist/”目录下所源码,它已经绑定好了。但是如果你是从源码开始构建的,你可能喜欢先定义是否必须要用于填充物,或者你已经支持了它们。

PhoneGap支持

HelloJS同时还可以支持在PhoneGap应用上。请看这个hellojs-phonegap-demo以了解更多。

Hello.then

函数hello.apihello.login以及hello.logout返回一个Promise/A+ 1.1.1兼容的then方法。

示例:Hello.api().then()

这个示例演示了如何在调用hello.loginhello.api时使用Promise对象以操作响应。

javascriptfunction login(network){
    // Make a login call and handle the response using promises
    hello.login(network).then(function(){
        console.log('fullfilled', 'making api call');
        // Reurn another promise to get the users profile.
        return  hello( network ).api( 'me' );
    }).then(function(p){
        // Print it to console.
        console.log('hello.api(me) was fullfilled', p);
        return p;
    }).then(function(p){
        // Insert it into thumbnail
        document.getElementById(network).innerHTML = "<img src='"+ p.thumbnail + "' width=24/>Connected to "+ network+" as " + p.name;
    }).then(null, function(e){
        // Uh oh
        console.error(e);
    });
}

示例:Promise.all

获得google好友以及联系人

javascriptfunction friendsAndContacts(network){
    // Make a login call and handle the response using promises
    hello(network).login({scope:'friends'}).then(function(){
        console.log('fullfilled', 'making api call');
        // Reurn another promise to get the users profile.
        return Promise.all([
            hello( network ).api( 'me/friends' ),
            hello( network ).api( 'me/contacts' )
        ]);
    }).then(function(all){

        // Build a list of friends
        var a = [];
        for(var i=0;i<all.length;i++){
            for(var j=0;j<all[i].data.length;j++){
                a.push(all[i].data[j].name);
            }
        }
        document.getElementById('friends').innerHTML = a.join(',');

    }, function(e){
        // Uh oh
        console.error(e);
    });
}

初始化应用

javascripthello.init( {
    google : CLIENT_IDS.google
},
{
    redirect_uri : '../redirect.html'
});

hellojs.phonegap


樊潇洁
415 声望23 粉丝

笨鸟先飞


« 上一篇
Hello.js参考2

引用和评论

0 条评论