약속, 추가 매개 변수를 전달한 다음 연결


100

예를 들어 약속 :

var P = new Promise(function (resolve, reject) {
  var a = 5;
  if (a) {
    setTimeout(function(){
      resolve(a);
    }, 3000);
  } else {
    reject(a);
  }
});

우리가 호출 한 후 프라 미스에 대한 메소드 :

P.then(doWork('text'));

doWork 함수는 다음과 같습니다.

function doWork(data) {
  return function(text) {
    // sample function to console log
    consoleToLog(data);
    consoleToLog(b);
  }
}

약속 및 텍스트 매개 변수에서 데이터에 액세스하기 위해 doWork에서 내부 함수를 반환하지 않으려면 어떻게해야합니까? 내부 기능을 피하는 트릭이 있습니까?


1
왜 누군가 의도적으로 카레를 포기 하겠습니까? 끔찍한 bind방법 을 사용하려면 ? -또한 매우 느립니다.

@ftor 이해가 안 돼요. 설명을 위해 코드를 제공해 주 시겠어요?
Roland

답변:


86

다음 Function.prototype.bind과 같이 첫 번째 인수에 값이 전달 된 새 함수를 만드는 데 사용할 수 있습니다.

P.then(doWork.bind(null, 'text'))

다음으로 변경할 수 있습니다 doWork.

function doWork(text, data) {
  consoleToLog(data);
}

이제, text실제로 것 'text'doWorkdata약속에 의해 해결 값이됩니다.

참고 : 약속 체인에 거부 처리기를 연결했는지 확인하십시오.


작업 프로그램 : Babel의 REPL에 대한 라이브 카피

function doWork(text, data) {
  console.log(text + data + text);
}

new Promise(function (resolve, reject) {
    var a = 5;
    if (a) {
      setTimeout(function () {
        resolve(a);
      }, 3000);
    } else {
      reject(a);
    }
  })
  .then(doWork.bind(null, 'text'))
  .catch(console.error);

감사합니다. 이전에 doWork.call (this, 'text')을 시도했지만 데이터가 'text'로 대체되었습니다.
user3110667

2
call제자리에서 함수를 호출하고 bind새 함수를 생성하지만 둘 다 첫 번째 인수로 실행 컨텍스트를 허용합니다.
sdgluck 2015 년

103

아마도 가장 간단한 대답은 다음과 같습니다.

P.then(function(data) { return doWork('text', data); });

또는 태그가 지정되어 있으므로 ecmascript-6화살표 함수를 사용합니다.

P.then(data => doWork('text', data));

나는 이것이 가장 읽기 쉽고 쓰기에는 너무 많지 않다고 생각합니다.


5

카레 사용하기.

var P = new Promise(function (resolve, reject) {
    var a = 5;
    if (a) {
        setTimeout(function(){
            resolve(a);
        }, 3000);
    } else {
        reject(a);
    }
});

var curriedDoWork = function(text) {
    return function(data) {
        console.log(data + text);
    }
};

P.then(curriedDoWork('text'))
.catch(
    //some error handling
);

b 조심하십시오. 이 함수의 첫 번째 줄에서 curriedDoWork수행하여 promise 를 생성 return new Promise()하면 promise는 호출하자마자 실행됩니다 curriedDoWork()(예..then(curriedDoWork('text'))
Flame

@Flame : 짧은 대답, 편의를 위해 약속을 함수로 래핑 할 수 있습니다.
germain

@yks, 꽤 흥미로운 구문을 표시했을 수 있습니다 const curriedWork = text => data => console.log (data + text)
germain

1
@germain 아 예 전에이 양식을 본 적이 있으며 함수형 프로그래밍을 좋아해야합니다. 그러나 일부 브라우저에서 화살표 기능이 중단되는 것을 경험하므로 지금은 피하는 경향이 있습니다.
yks

@yks, Internet Explorer 만 지원하지 않으며 Edge 때문에 Internet Explorer 마지막 ​​빌드는 2015 년 12 월 9 일이었습니다. ~
germain

0

Lodash는이 정확한 것에 대한 좋은 대안을 제공합니다.

 P.then(_.bind(doWork, 'myArgString', _));

 //Say the promise was fulfilled with the string 'promiseResults'

 function doWork(text, data) {
     console.log(text + " foo " + data);
     //myArgString foo promiseResults
 }

또는 성공 함수가 하나의 매개 변수 (충족 된 약속 결과) 만 갖도록하려면 다음과 같이 활용할 수 있습니다.

P.then(_.bind(doWork, {text: 'myArgString'}));

function doWork(data) {
    console.log(data + " foo " + this.text);
    //promiseResults foo myArgString
}

이것은 함수 내의 컨텍스트에 첨부 text: 'myArgString'됩니다 this.


0

이 질문에 대한 새로운 대답은 'this'를 자동으로 묶고 훨씬 더 읽기 쉬운 화살표 함수를 사용하는 것입니다. 다음과 같은 링크를위한 Google : https://2ality.com/2016/02/arrow-functions-vs-bind.html

다음과 같이 텍스트를 설정할 수 있습니다. this.text = 'text'P.then (data => doWork (data)); // doWork 내부의 this.text는 'text'로 평가됩니다.

이것은 위의 jib에 의해 제안되었으며 그 (또는 이것!)이 지금 받아 들여지는 대답이어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.