как обернуть гугл или авторизовать обратный вызов в обещании? - PullRequest
0 голосов
/ 12 мая 2018

Я взял один из примеров быстрого запуска google nodejs examples как образец того, как выполнить oauth, переписав его как объект класса, чтобы я мог включить его в свой более крупный проект.Я могу успешно запустить API-скрипт скрипта приложения scripts.run и получить действительное возвращаемое значение в объекте класса, но не как вернуть его в содержащий проект.

scripts.run содержащая функция выглядит следующим образом

  Goo.prototype.testAuth = function( auth ){
     var script = google.script('v1');
     var cmd = {
        auth,
        resource: { function: 'test_auth', devMode: true },
        scriptId: '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
     };

     script.scripts.run(
        cmd,
        function( err, resp ){
        if( err ){ console.log('The API returned an error: ' + err);return }
        if( resp.error ){console.log('Script error message: '
                             + resp.error.details[0].error.errorMessage);}
        else {
           console.log('resp from api call', resp.response.result );
           return resp.response.result ;
        }
     });

  };

с return resp.response.result проблемной частью, потому что она не передана обратно var response в контейнере

 var Goo = require('./Goo.js');
 var goo = new Goo();
 var response = goo.test_auth();
 console.log('response to use elsewhere ',response);

, как известно специалистам, console.log в классе Goo возвращает значение, в то время как console.log в контейнере возвращает неопределенное значение.

Весь класс Goo упакован следующим образом, если это важно

  (function(){
     var Goo = (function(){
        var Goo = function(config){
        }
        Goo.prototype.test_auth = function(){
            this.authorize( this.testAuth );
        };
        Goo.prototype.testAuth = function(){};
        Goo.prototype.authorize = function(){};
     })();
     module.exports = Goo;
  })();

Как мне структурировать его так, чтобы он возвращал значение, которое будет использоваться в контейнере?

Я неясно, должен ли я пытаться обернуть скрипт script.scripts.run в обещание, если он уже возвращает обещание, и я не знаю, как ожидать его возврата, или если тот факт, что я имею дело с функцией обратного вызова, приводит кчто неправильное решение.Любое руководство здесь приветствуется.

Я использую node.js и googleapis ^ 24.0.0

1 Ответ

0 голосов
/ 12 мая 2018

Функция testAuth не возвращает ничего, как написано в данный момент. Можно «пообещать» это что-то вроде следующего ...

Goo.prototype.testAuth = function( auth ){
    return new Promise((resolve, reject) => {
        var script = google.script('v1');
        var cmd = {
           auth,
           resource: { function: 'test_auth', devMode: true },
           scriptId: '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
        };

        script.scripts.run(
           cmd,
           function( err, resp ){
           if( err ){
               console.log('The API returned an error: ' + err);
               reject(err);
           } else if( resp.error ){
               console.log('Script error message: ' + resp.error.details[0].error.errorMessage);
               reject(resp.error);
           } else {
               console.log('resp from api call', resp.response.result );
               resolve(resp.response.result);
           }
        });
    });
};

Тогда назови это так ...

var Goo = require('./Goo.js');
var goo = new Goo();
goo.test_auth().then(response => {
    console.log('response to use elsewhere ',response);
}).catch(error => {
    console.log('error ',error);
});

Извините, форматирование отступов немного странно. OP использует 3 пробела для отступов, а не обычные 2 или 4. (Примечание для себя: идея для следующего эпизода "Силиконовой долины")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...