0

我有一个 controller.js 文件,我试图从我的 feed-service.js 文件中获取数据。FEEDLY_USER_ID 和 FEEDLY_ACCESS_TOKEN 可以在单独的 config.js 文件中访问和定义。

控制器.js:

$scope.feedlyGlobalAll = FeedService.getGlobalAll();

饲料-service.js:

var request = require('request');
var globalOptions = {
    url: 'https://cloud.feedly.com/v3/streams/contents?streamId=user/' + FEEDLY_USER_ID + '/category/global.all',
    auth: {
        'bearer': FEEDLY_ACCESS_TOKEN
    }
};

service.getGlobalAll = function(){
    request.get(globalOptions, function(error, response, body){
        if(!error && response.statusCode == 200){
            service.globalAll = JSON.parse(body);
            return service.globalAll;
        }
        // error code here //
   })
}

我正在使用一个名为“request”的 npm 包来制作 GET,因为我无法让 https.get() 工作。此 Feedly API 调用需要 URL、我的用户 ID 和在标头中传递的访问令牌。

我一直在阅读,显然我应该使用回调或承诺,但我无法让它们中的任何一个工作。使用 http.get(),我可以利用 http.get().then(yada yada) 的 promise,它适用于我在其他地方进行的 forecast.io 调用。请求模块显然不允许 .then()。我通常会遇到 TypeError 并且 .then() 不是函数。

当我尝试执行 https.get() 时,这是我使用的代码。我永远无法获得成功的回应。

var url = {
    url: 'https://cloud.feedly.com/v3/streams/contents?streamId=user/' + FEEDLY_USER_ID + '/category/global.all',
    'headers': {
        'Authorization': 'Bearer ' + FEEDLY_ACCESS_TOKEN
    }
};

https = require('https');
https.get(url).then(yada yada)

我在 var url 中为 https.get 调用尝试了很多东西。我尝试了带引号和不带引号,我只尝试了 auth: Bearer token 因为它与请求模块一起工作,但无法让它工作。

这个问题的解决方案是:

  1. 使用现有请求模块代码从 feed-service 回调到控制器。
  2. 找出正确的方法来形成 https.get 请求的 url,然后我可以利用它的 promise 函数。
4

1 回答 1

0

在您的请求回调中使用承诺:

service.getGlobalAll = function() {
   return $q(function(resolve, reject) {
      request.get(globalOptions, function(error, response, body){
         if(!error && response.statusCode == 200){
            service.globalAll = JSON.parse(body);
            resolve(service.globalAll);
        } else {
          reject();
        }
     });
   });
};

$q(angular 的 promise api)可以作为依赖注入到你的服务中。上面的代码将返回一个承诺,当您的库的 ajax 调用返回时,该承诺将得到解决,因此您可以使用 .then() 访问它。

于 2016-01-21T23:18:00.567 回答