如何使用 Bluebird promisification 和 generators + parallel promises

How to use Bluebird promisification with generators + parallel promises

尝试使用 bluebird 和 koa 生成器来满足节拍 api 的多个请求。

在阅读了一些文档后,我认为以下内容可行

var request = require('co-request'),
  _ = require('lodash'),
  Promise = require('bluebird');
  request = Promise.promisifyAll(request);

module.exports.getTracks = function *tracks(){    
    firstCall = yield makeAPICall('users/' + me + '/mymusic/tracks?limit=150');
      total = firstCall.body.info.total;
      total -= 150;
      tracks = firstCall.body.data;

      //Beats only allows a maximum of 150 tracks per call
      //If more tracks are needed then the remainder is called in sets of 150
      var offset = 150;
        while (total > 0) {
          promises.push(makeAPICall('users/' + me + '/mymusic/tracks?limit=150&offset=' + offset));
          offset += 150;
          total -= 150;
        }

    var responses = yield(Promise.all(promises));
}

    function makeAPICall (query){
      var authOptions = {
        url: 'https://partner.api.beatsmusic.com/v1/api/' + query,
        headers: { 'Authorization': 'Bearer ' + accessToken },
        json: true
      };
      return request.get(authOptions);
    }

方法 makeAPI 调用按 firstCall 的预期工作,但出于某种原因,当我开始将 makeAPICall 方法放入数组时,它们似乎从未执行过。变量响应仅产生一个函数数组,而不是来自节拍 api 的响应数组。我需要更改什么才能使响应 return 类似于 firstCall 的对象数组?

您使用的联合请求已经将回调转换为 thunk,因此无需尝试和承诺。

这是一个简化的 运行nable 示例,类似于您的代码,展示了如何 运行 api 与 Koa(在后台使用 co)并行调用。
当你产生一个数组时,co 将并行 运行 任何 thunks/promises/generators 等。

var request = require('co-request'),
    co      = require('co');

co(function *(){
  var results = yield getTracks();
  results.forEach(function(result){
    console.log(result.body);
  })
}).then();

function * getTracks () {
  var queries = [];
  // swap out your queries here
  queries.push(makeAPICall('5185415ba171ea3a00704eed'));
  queries.push(makeAPICall('54fdc3c9862a3aab01dc95cf'));
  queries.push(makeAPICall('54fdc3da862a3aa501dc95d0'));
  // yielding an array returns an array of results
  var results = yield queries;
  return results;
}

function makeAPICall (query) {
  var options = {
    url: 'http://www.mocky.io/v2/' + query,
    json: true
  }
  return request.get(options)
}