2016-04-28 3 views
3

Kann ich diesen Code ändern, damit er ein Versprechen gibt?Kann Google Kalender API Anruf ein Versprechen in eckigen Fabrik zurückgeben?

var calApi = { 
fun3: function() { 
    gapi.auth.authorize(
     { 
     'client_id': CLIENT_ID, 
     'scope': SCOPES.join(' '), 
     'immediate': true 
     }, calApi.fun2); 
}, 
fun2: function(authResult) { 
    if (authResult && !authResult.error) { 
     calApi.fun4(); 
    } 
}, 
fun1: function(event) { 
    gapi.auth.authorize(
     {client_id: CLIENT_ID, scope: SCOPES, immediate: false}, 
     calApi.fun2); 
    return false; 
}, 
fun4: function() { 
    gapi.client.load('calendar', 'v3', calApi.fun5); 
}, 
fun5: function() { 
    // some code 
    // returning the result... 
} 
}; 
return calApi; 

mein Controller:

$scope.hanleAPICall = function(event) { 
    factoryName.fun1(event); 
}; 

dieser Code von Google gemacht calendar api und im Versuch, es in einer AngularJS Fabrik zu implementieren, aber ich brauche, um das Ergebnis der Ereignisse aus der api als zurückzukehren Versprechen Sie, dass ich die Ereignisse zurückgebe, aber nichts passiert auf meiner Seite.

+0

'gapi.client.load (...)' und andere Erträge versprechen? –

+0

ich denke, keiner von ihnen gibt Versprechen zurück, wie Sie im [link] sehen können (https://developers.google.com/google-apps/calendar/quickstart/js#step_2_set_up_the_sample) – Dimitar

+0

Wenn der Rückgabewert kein Versprechen ist Sie können es immer in ein Versprechen mit eckigen $ q Modul machen. –

Antwort

1

Sie können so etwas wie unten tun ein Versprechen in Betrieb nehmen:

angular.module('app', []) 
.factory('AppService', function ($q) { 
    return { 
    fun3: fun3 
    }; 

    function fun3() { 
    var defer = $q.defer(); 

    gapi.auth.authorize(
     { 
     'client_id': CLIENT_ID, 
     'scope': SCOPES.join(' '), 
     'immediate': true 
     }, handleAuthResult); 

    function handleAuthResult (authResult) { 
     if (authResult && !authResult.error) { 
     defer.resolve(authResult); 
     } else { 
     defer.reject(authResult.error); 
     } 
    } 

    return defer.promise; 
    } 
}); 

Ähnlich wie oben Sie Factory-Methoden für Ihre anderen Methoden erstellen können fun1, fun2, fun4, fun5

1

Sie können alles, Promisify , was Sie brauchen (meiner Meinung nach) ist ein Wrapper um die gapi Bibliothek, das ist alles.

Gerade jetzt:

  1. globale Variablen vermeiden, erstellen Sie zwei Konstanten (GAPI_CLIENT_ID, GAPI_SCOPES)
  2. ein [Service][1] erstellen, das tut, was gapi tut, sondern in einem Winkel Art und Weise.

Das ist ein wenig Refactoring des Codes sein sollte ...

function GapiServiceFactory($q, GAPI_CLIENT_ID, GAPI_SCOPES) { 
 
    var self = this; 
 
    
 
    /** 
 
    * @private 
 
    **/ 
 
    self._authorize = function(immediate) { 
 
    var deferred = $q.defer(); 
 
    var data = { 
 
     client_id: GAPI_CLIENT_ID, 
 
     scope: GAPI_SCOPES, 
 
     immediate: !!immediate 
 
    }; 
 
    
 
    gapi.auth.authorize(data, function(result) { 
 
     if(Object.hasOwnProperty.call(result, 'error')) { 
 
     return deferred.reject(result); 
 
     } 
 
     
 
     return deferred.resolve(result); 
 
    }); 
 
    
 
    return deferred.promise; 
 
    }; 
 
    
 
    self.authorize = function() { 
 
    return self._authorize(false); 
 
    }; 
 
    
 
    self.authorizeImmediate = function() { 
 
    return self._authorize(true); 
 
    }; 
 
    
 
    self.loadCalendar = function() { 
 
    var deferred = $q.defer(); 
 
    
 
    gapi.client.load('calendar', 'v3', function() { 
 
     
 
     if(/**What's the logic here? **/) { 
 
     return deferred.reject(); 
 
     } 
 
     
 
     return deferred.resolve(); 
 
    }); 
 

 
    return deferred.promise; 
 
    }; 
 
} 
 

 
angular 
 
    .module('Test', []) 
 
    .constant('GAPI_CLIENT_ID', 12333) 
 
    .constant('GAPI_SCOPES', ['read', 'write']) 
 
    .service('GapiService', GapiServiceFactory) 
 
    .controller('TestCtrl', function TestCtrl(GapiService) { 
 
    GapiService 
 
     .authorizeImmediate() 
 
     .then(
 
     console.log.bind(console, 'Authorization success'), 
 
     console.log.bind(console, 'Authorization error') 
 
    ) 
 
    ; 
 
    
 
    GapiService 
 
     .loadCalendar() 
 
     .then(
 
     console.log.bind(console, 'LoadCalendar success'), 
 
     console.log.bind(console, 'LoadCalendar error') 
 
    ) 
 
    ;  
 
    }) 
 
;