2017-01-28 1 views
0

특정 경우 콜백 함수에 매개 변수를 전달하려고합니다. 예를 들어 동일한 기능을 가리키고 싶은 두 개의 경로가 있습니다. 복수형을 지정하는 경로의 경우 여러 항목을 삭제할 수 있습니다.바인드를 사용하여 전달 된 콜백 함수 매개 변수의 순서 지정

server.app.delete('/api/delete/sku', this.deleteSku); 
server.app.delete('/api/delete/skus', this.deleteSku); 

deleteSku(req, res, allowMultiple = false) { 
    //... delete code here ... 
} 

I는이

server.app.delete('/api/delete/sku', this.deleteSku); 
server.app.delete('/api/delete/skus', _.bind(this.deleteSku, _, _, true)); 

같은 밑줄와 lodash 수행 할 수 있습니다 알고하지만이 나에게 추한 느낌이 나는 그것이 사람들이 익숙하지 않은 특히, 코드의 가독성에 영향을 생각한다 밑줄이 그어진 다.

또한 네이티브 바인딩을 통해 인수를 지정할 수 있다는 것을 알고 있지만 인수는 함수 앞에 표시됩니다.

server.app.delete('/api/delete/sku', this.deleteSku); 
server.app.delete('/api/delete/skus', this.deleteSku.bind(null, true)); 

deleteSku (allowMultiple = false, req, res) { } 

지금 그냥 처음 allowMultiple를 처리 할 수 ​​ deleteSku를 다시 작성하는 이상한 느낌이 나는 단수 경로 케이스에 결합하지 않는 경우가 나옵니다.

다른 옵션은 본질적으로 동일한 작업을하지만 다른 경로로 매핑하는 deleteSkudeleteSkus 메서드를 모두 사용하는 것입니다. 코드가 적어 질 수있는 더 나은 솔루션이있을 수 있기를 바랍니다.

+0

글쎄'.bind()'가하는 일을합니다. 당신은 그것을 사용하는 방식으로 쓰거나 다른 곳에서 args를 넣는 다른 것을 사용할 수 있습니다. 아니면 args를 사용하여 실제 함수를 호출하는 스텁 함수를 선언 할 수 있습니다. 네가 여기에 오기를 기대하고 있는지 잘 모르겠다. '.bind()'가하는 일을 알고있는 것처럼 보이고 다른 옵션이 있다는 것을 아는 것 같습니다. 그렇습니다, 밑줄/로다시 물건은 추악하고 많은 사람들에게는 익숙하지 않습니다. – jfriend00

+0

필자는 개인적으로 stub 함수를 사용하고 싶습니다 :'server.app.delete ('/ api/delete/skus', (req, res) => this.deleteSku (req, res, true));'It 's 가독성을 위해 이길 수는 없습니다. – jfriend00

+0

급행으로 아주 조심하십시오.때로는 ((req, res, next))를 넘겨주는 ('req, res)'이상을 통과 할 수 있습니다. – jfriend00

답변

0

.bind()은 처음에 추가 args 만 바인딩합니다. 나는 당신이 당신의 allowMultiple 인수를 원할 때가 아니라는 것을 당신에게 동의 할 것입니다. 그래서, .bind()은 정말로 당신을 위해 옳은 일을하지 않을 것입니다. 처럼 앞에 붙이기보다는 인수를 후행시키기 위해 자바 스크립트에 내장 된 옵션은 없습니다.

Express가 콜백 (req, res, next)에 세 번째 인수를 전달할 때 완전히 확신 할 수 없기 때문에 경로 처리기로 수행하는 것처럼 기본 인수를 사용하여 매우주의해야합니다. Express가 세 번째 인수를 전달하고 경로 처리기 this.deleteSku이 실수로 allowMultiple 인수가 전달 될 때이를 해석 할 가능성이 높습니다. 그 때문에, 나는 당신이 이렇게 좋을 것 :

server.app.delete('/api/delete/sku', (req, res) => this.deleteSku(req, res, false)); 
server.app.delete('/api/delete/skus', (req, res) => this.deleteSku(req, res, true)); 

그런 다음 모든 상자를 선택 :

  1. 그것은 여전히 ​​한 줄의 코드.
  2. 그것은 완전히 모호하고 무엇을하고 있는지 읽을 수 있어요
  3. 그것은 제 3 자 라이브러리
  4. 에 의존하지 않는 그것은 당신의 핸들러와 혼란 것들에 next 인수를 전달 익스프레스 완전히 안전합니다.
+0

@ SimonLau-Yamauchi -이 질문에 대한 답변을 했습니까? 그렇다면 답장의 왼쪽에있는 녹색 체크 표시를 확인하여 커뮤니티에 표시하십시오. (또한 올바른 절차에 따라 평판 포인트를 얻으십시오.) 그렇지 않다면, 당신이 아직도 혼란스러워하고있는 것에 대해이 대답 아래에 코멘트를 남겨주세요. – jfriend00

관련 문제