2016-10-12 1 views
-1

私はAPIのラッパーを使用していますが、エンドポイントはクエリの際にユーザーIDだけを受け取りますが、ユーザー名で検索できる単一のエンドポイントがあります(ラッパー、searchByUsername、以下で使用します)。外部ライブラリのないノードで複数の非同期http要求を処理する適切な方法は何ですか?

var convertToID = function (username, callback) { 
    searchByUsername(username, function (error, response, body) { 
     if (body.users[0]){ 
     callback(body.users[0].username) 
     } 
    }) 
    }; 

そして、ここでは、私はそれを使用している方法は次のとおりです:

this.relationship = function (user, query, callback) { 
    if (isNaN(user)) { 
     convertToID(user, function (ID) { 
     get('/users/' + ID + '/relationships/?query=' + query, callback); 
     }) 
    } else { 
     get('/users/' + user + '/relationships/?query=' + query, callback); 
    } 
    } 

これは正常に動作しますが、それは明らかに次善のですが、すべての要求火災の前にそれらを変換するために我々のユーザーの柔軟性を与えるためにヘルパー関数これを私のラッパーのすべてにドロップしてください。 Rubyのバックグラウンドから来て、私はこれを一本の線に集約することができました。しかし、JSの非同期の性質は、私の脳をひねるようなものです。私が本当に欲しいのに匹敵するものです:JSの落とし穴非同期(async)が、私は何かが欠けている必要があります(はい、私はそれらの多くがあります知っている)私は他の答えを探ってきました

var user = isNaN(user) ? convertUsernameToID(user) : user; 
get('/users/' + user + '/relationships/?query='+query, callback); 

再。過去の大規模なプロジェクトでは、私は非同期パッケージを使用しましたが、これには過剰な気分があり、実際にはこれを嫌っていました。あなたが約束を使用している場合

+0

約束を見ましたか? – Bergi

+0

あなたの 'convertToID'関数はエラーをうまく処理していないようです。あなたは本当に約束を見なければなりません。 – Bergi

+0

@Bergiええ、私はブルーバードとES6の約束に少し曝露しました。私は実際に似たような問題にぶつかることを覚えています。それは入れ子関数から値を返すことができないということでした。だから私はまだ上記の1行の解決策のようなものを達成することができませんでした - 私はそれらを誤解していない限り。私の頭はRubyの土地にあまりにも張り付いていますか? – commitaphobe

答えて

0

あなたは

function relationship(user, query, callback) { 
    if (isNaN(user)) 
    convertToID(user, getById); 
    else 
    getById(user); 

    function getById(ID) { 
    get('/users/' + ID + '/relationships/?query=' + query, callback); 
    } 
} 

を使用することができ、それがさらに簡単になり、if-else flow in promise (bluebird)を参照してください。

関連する問題