developer tip

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

copycodes 2020. 9. 7. 08:22
반응형

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


예를 들어 약속 :

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에서 내부 함수를 반환하지 않으려면 어떻게해야합니까? 내부 기능을 피하는 트릭이 있습니까?


다음 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);

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

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

Or, since this is tagged ecmascript-6, using arrow functions:

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

I find this most readable, and not too much to write.


Use currying.

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
);

Lodash offers a nice alternative for this exact thing.

 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
 }

Or, if you'd like your success function to have only one parameter (the fulfilled promise results), you can utilize it this way:

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

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

This will attach text: 'myArgString' to the this context within the function.

참고URL : https://stackoverflow.com/questions/32912459/promises-pass-additional-parameters-to-then-chain

반응형