2016-09-23 73 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

你也可以重新排序。大概''回調'總是需要的,那麼爲什麼不把它作爲第一個而不是最後一個參數呢?另一種方法是傳遞一個參數,這個參數是'state','city','callback'和'department'屬性的一個對象。或者,假設您正在執行ajax調用並且回調應該在完成時執行,只需讓您的函數返回一個承諾,您就可以將回調附加到返回的承諾上。 –

回答

1

你的方法是完全正確的,也是一種常見模式。另一個選擇是讓你的函數返回一個Promise,而不是依賴回調。這將允許你繞過檢查,如果最後一個參數是

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

我不明白關於「多functionss而不是」中的部分功能或回調。 但是關於在參數列表中間有可選參數的要求,我遵循對象方法。

而不是做

getStatus(state, city, department, callback) 

我做這樣的

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

和函數中,從分配對象到varables值。 這樣你可以省略和使用任何參數。

這種方法有一個很好的好處。我們經常需要對參數列表進行更改。有時會添加新的參數列表,有時會從參數列表中刪除一些參數,有時我們需要更改順序等。所有這些操作在使用參數時都需要非常小心,因爲這可能會導致函數定義與函數調用不同。但採用這種方法,這種情況可以輕鬆處理。