2016-07-28 79 views
1

考慮示例代碼的函數:調用使用默認參數也有所回調

function makeRequest(endpoint, form = {}, qs = {}, callback) { 
    const exampleObject = { 
    endpoint, 
    form, 
    qs, 
    }; 
    callback(exampleObject); 
} 

makeRequest('/example', { foo: 'string' }, { bar: 'string' }, (exampleObject) => { 
    console.log(exampleObject); 
}); 

在上面的例子中,以下對象將在控制檯上登錄:

{ endpoint: '/example', 
    form: { foo: 'string' }, 
    qs: { bar: 'string' } } 

我怎樣才能使用makeRequest中的默認值,仍然使用回調?例如,下面的失敗:

makeRequest('/example', (exampleObject) => { 
    console.log(exampleObject); 
}); 

輸出:

/Users/daniel/example.js:13 
    callback(exampleObject); 
^

TypeError: callback is not a function 
    at makeRequest (example.js:7:3) 
    at Object.<anonymous> (example.js:10:1) 
    at Module._compile (module.js:409:26) 
    at loader (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:148:5) 
    at Object.require.extensions.(anonymous function) [as .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:158:7) 
    at Module.load (module.js:343:32) 
    at Function.Module._load (module.js:300:12) 
    at Function.Module.runMain (module.js:441:10) 
    at /usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:160:24 
    at Object.<anonymous> (/usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:161:7) 

這是有道理的考慮,我只發送一個參數。我想知道如何在利用默認參數的情況下撥打makeRequest並仍然可以回撥。如果回調存在,我將總是必須傳遞三個參數嗎?是否還有其他方法可以解決這個問題,所以我可以選擇僅使用第二個和第三個參數,並且在回調中總是獲得exampleObject

+3

不要使用回調。回報承諾。 – Bergi

回答

4

如何destructuring

function makeRequest({ endpoint, form = {}, qs = {}, callback =() => {} }) { 
 
    const exampleObject = { 
 
    endpoint, 
 
    form, 
 
    qs, 
 
    }; 
 

 
    callback(exampleObject); 
 
} 
 

 
makeRequest({ 
 
    endpoint: '/example', 
 
    callback: (x) => console.log(x) 
 
});

+0

像這樣的東西正是我所期待的。謝謝! – Daniel

3

傳遞undefined將使用default parameter

makeRequest('/example',undefined,undefined,(exampleObject) => { 
    console.log(exampleObject); 
}); 
+0

這確實有用,謝謝你提供的鏈接,所以我可以閱讀它。只有我有問題,是否有可能得到相同的結果,而不必傳遞第二個和第三個'undefined'參數? – Daniel

+0

你將不得不實現/找到一個函數重載機制,以便能夠使用參數來完成它。安德烈亞斯的回答是一種很好的方式來處理一個對象,並且可能更多地沿着你想要調用函數的方式。 –