2016-11-17 11 views
0

NB:コードレビューとして考えないでください。私はREST APIの代わりにソケットや他のデータソースを想像することができます。問題は、JSの方法でこの種のタスクを解決する方法です。Node.jsで「測定されていない」ものを扱う一般的な方法

いくつかのアイテムを公開するいくつかの残りのAPIを使用します。オフセットとカウントによってアイテムを取得できます。しかし、一度に最大1000。それは動作しますが、いくつかの問題を抱えている

const request = require('superagent') 
const _ = require('lodash') 
const bluebird = require('bluebird') 

const STEP = 1000 

function call(offset) { 
    return bluebird.resolve(
    request 
     .get('someapi/items') 
     .auth('name', 'key') 
     .query({ 
     offset: offset, 
     languagecodes: ['en'] 
     }) 
) 
    .then((req) => req.body) 
} 

function grab(acc, offset) { 
    acc = acc || [] 
    offset = offset || 0 
    return call(offset) 
    .then((items) => { 
     doSomething(items) 
     if(items.length < STEP) { 
     return 
     } 
     return grab([], offset + STEP) 
    }) 
} 

grab().then(() => { 
    finishDo() 
}).catch(function(err) { 
    console.log(err) 
    throw err 
}) 

    そして、あなたは、私は以下のコードを使用して、この種の仕事のためのアイテムの数(あなただけ自分でそれらを数えることができる)

    を照会カント私は、ビジネスロジック(集約、フィルタリング、変換)のいずれかの種類が必要な場合は

  • コードは、私がgrab関数の内部ですべてを置く必要がある
  • あまりにも具体的である

このコードをどのように書き直すことができますか?ここで

+0

ストリームのNode.jsを作成して処理するためにhighland.jsを使用するサンプルの下 。彼らは一緒に働く。あなたのコールバックは、物事を約束しておくという約束を返すこともできます。 – Keith

+0

(cities)=> {}構文を使用する代わりに、 'return call(offset).then(()=> {referenced_function(cities)}')のように関数を引数として渡すことを検討してください。 –

+0

ご意見ありがとうございます。私は私の答えを追加しました – kharandziuk

答えて

2

は、コールバックを使用した例であり、

私も青い鳥をしようと使用してきた、これはあなたのコールバックでの約束を返さない場合には、それはまだ、IOWに動作します便利です:あなたのコールバックすることができますまた、あなたが望むなら約束をしてください。

function grab(cb, acc, offset) { 
 
    acc = acc || [] 
 
    offset = offset || 0 
 
    return call(offset) 
 
    .then((items) => { 
 
     return bluebird.try(() = > cb(items)).then(() => { 
 
     if(items.length < STEP) { 
 
      return 
 
     } 
 
     return grab(cb, [], offset + STEP) 
 
     }) 
 
    }) 
 
} 
 

 
//To use.. 
 

 
grab((items) => { 
 
    //do something with items. 
 
});

0

私は私が何をしたいです実現。実際、私はAPIの回答をいくつかのストリームとして扱うことができます。これは、私が収集に使用するのと同じ操作(縮小、フィルター、マップ)を使用する能力を私に提供します。あなたの使用しての約束は、あなたがまだコールバックを使用することはできませんという意味ではありませんという理由だけで、あなたのグラブ関数にコールバックを追加することができ

const H = require('highland'); 

function grabApi() { 
    let offset = 0 
    return H(function (push, next) { 
     call(offset).then(function(items) { 
      push(null, items) 
      if(items.length === STEP) { 
      offset = offset + STEP 
      next() 
      } else { 
      push(null, H.nil) 
      } 
     }) 
    }) 
}; 

grabApi() // now it's node-like stream 
.filter(/* some function */) 
.map(/* some function */) 
.each(function(x) { ... 
.done(function() { // when it'll end 
関連する問題