2016-09-23 16 views
0

statusと呼ばれるAPIエンドポイントがあります。このように使用する必要があります:コールバック引数の前のオプション引数

status/ohio/columbus 
status/nebraska/fremont 
status/ohio/columbus/police 
status/nebraska/fremont/fire 

州と都市のパスは必須ですが、部門はありません。

戻り値でコールバックを更新する関数が必要です。以下の機能は妥当か混乱していますか?代わりに複数の関数、getStatusとgetStatusForDepartmentを持つべきですか?

function getStatus(state, city, department, callback) 
{ 
    let status = "status/"+state+"/"+city 
    if(typeof department != "function"){ 
     status = status+"/"+ department 
    }else{ 
     callback = department 
    } 
    ... 
} 
+2

引数は必須ではありませんが、引数が引数リストの真ん中にあるときに、通常はそれを行う方法で解決されます。 jQueryを含むほとんどのライブラリも同じことをしています。 – adeneo

+0

あなたはまたそれを並べ替えることができます。おそらく 'callback'は常に必要なので、最後の引数ではなく最初にしてみてはどうでしょうか?もう一つの方法は 'state'、' city'、 'callback'、おそらく' department'プロパティを持つオブジェクトである単一の引数を渡すことです。または、あなたがajax呼び出しを行っていると仮定し、コールバックが完了した時点で実行することになっていると仮定して、関数が約束を返すようにして、返された約束にコールバックを付けることができます。 –

答えて

1

あなたのアプローチは完全によく、共通のパターンです。別のオプションは、コールバックに頼るのではなく、関数がPromiseを返すようにすることです。最後の引数は、私は「ではなく、複数のfunctionss」に関する部分を理解していなかった

function getStatus(state, city, department) { 
    return new Promise((resolve, reject) => { 
     let status = "status/"+state+"/"+city 
     if (department) { 
      status += '/' + department; 
     } 
     ... 

     if (successThingHappens) { 
      resolve(data); 
     } else { 
      reject(error); 
     } 
    }); 
} 

getStatus('CA', 'San Francisco').then((data) => { 
    console.log('do something with', data); 
}).catch((err) => { 
    console.error('something went wrong', error); 
}); 
0

関数またはコールバックがある場合、これは、あなたがチェックをバイパスできるようになります。 しかし、パラメータリストの途中でオプションの引数を取る必要があるということについて、私はオブジェクトのアプローチに従います。

代わりの

getStatus(state, city, department, callback) 

をやって、私はこの

var arg_list = {"state": state, "city": city, "department": department, "callback": callback}; 
getStatus(arg_list); 

のように行うと、関数内で、オブジェクトからvarablesに値を割り当てます。 このようにして、パラメータを省略して使用することができます。

このアプローチには非常に良い利点があります。パラメータリストを変更する必要があることがよくあります。時には新しいものを追加して、いつもパラメータリストからいくつかを削除し、時には順序などを変更する必要があります。これらの操作は、パラメータを使用する際に非常に慎重に行う必要があります。しかし、このアプローチでは、このようなケースは容易に処理できます。

関連する問題