JavaScript로 커스텀 콜백 만들기


322

현재 함수 실행이 끝나면 콜백 함수를 실행하기 만하면됩니다.

function LoadData() 
{
    alert('The data has been loaded');
    //Call my callback with parameters. For example,
    //callback(loadedData , currentObject);
}

이 기능의 소비자는 다음과 같아야합니다.

object.LoadData(success);

function success(loadedData , currentObject) 
{
  //Todo: some action here 
}

이것을 어떻게 구현합니까?


3
object.LoadData(success)호출 이후 function success 가 정의 되어야합니다 . 그렇지 않으면 함수가 정의되지 않았다는 오류가 발생합니다.
J. Bruni

답변:


574

실제로 코드는 거의 작동합니다. 콜백을 인수로 선언하면 인수 이름을 사용하여 직접 호출 할 수 있습니다.

기본

function doSomething(callback) {
    // ...

    // Call the callback
    callback('stuff', 'goes', 'here');
}

function foo(a, b, c) {
    // I'm the callback
    alert(a + " " + b + " " + c);
}

doSomething(foo);

이 호출은 doSomething이고, 호출 foo하면 "건물이 여기로 간다"는 경고를 보냅니다.

함수를 호출하고 결과 ( )를 전달하는 대신 함수 참조 ( foo) 를 전달하는 것이 매우 중요합니다 foo(). 귀하의 질문에, 당신은 그것을 올바르게 수행하지만 일반적인 오류이기 때문에 지적 할 가치가 있습니다.

더 고급스러운 것들

때로는 콜백을 호출하여에 대한 특정 값을 볼 수도 this있습니다. JavaScript call함수 를 사용하면 쉽게 할 수 있습니다 .

function Thing(name) {
    this.name = name;
}
Thing.prototype.doSomething = function(callback) {
    // Call our callback, but using our own instance as the context
    callback.call(this);
}

function foo() {
    alert(this.name);
}

var t = new Thing('Joe');
t.doSomething(foo);  // Alerts "Joe" via `foo`

인수를 전달할 수도 있습니다.

function Thing(name) {
    this.name = name;
}
Thing.prototype.doSomething = function(callback, salutation) {
    // Call our callback, but using our own instance as the context
    callback.call(this, salutation);
}

function foo(salutation) {
    alert(salutation + " " + this.name);
}

var t = new Thing('Joe');
t.doSomething(foo, 'Hi');  // Alerts "Hi Joe" via `foo`

때로는 콜백을 제공하려는 인수를 개별적이 아닌 배열로 전달하는 것이 유용합니다. 당신은 그렇게 할 수 있습니다 apply:

function Thing(name) {
    this.name = name;
}
Thing.prototype.doSomething = function(callback) {
    // Call our callback, but using our own instance as the context
    callback.apply(this, ['Hi', 3, 2, 1]);
}

function foo(salutation, three, two, one) {
    alert(salutation + " " + this.name + " - " + three + " " + two + " " + one);
}

var t = new Thing('Joe');
t.doSomething(foo);  // Alerts "Hi Joe - 3 2 1" via `foo`

난 당신이 쓴 예와 같이 매개 변수가없는 경우가 작동합니다 알고 있지만 난 예외를 던지고 나에게 기능을 말하고 매개 변수와 함수를 통과 할 때 정의되지 않은
Amgad Fahmi

@TiTaN : 이상합니다. 콜백에 매개 변수를 전달하는 데 특별한 것은 없습니다. 함수에 전달하는 콜백 참조는 다른 참조와 같은 함수 참조이므로 모든 일반적인 작업을 수행 할 수 있습니다.
TJ Crowder 2019

4
@ 답변 한 사람 : TiTaN의 문제는 인수를 필요로하지 않는 콜백에 인수가 필요한 함수를 전달하는 방법을 모른다는 것입니다. 생각하십시오 setTimeout(). 답은 콜백을 클로저로 감싸는 것입니다.doSomething(function(){foo('this','should','work')})
slebetman

누군가 TiTaN이 위의 문제를 논의하는 스레드 (바람직하게는 SO)를 가리키면 내 검색은 약합니다.
slebetman

1
@Webwoman-사용 사례에 따라 다릅니다. 인수로 전달하거나 일종의 설정 / 옵션 개체 또는 다른 여러 옵션에 포함시킬 수 있습니다.
TJ Crowder 2019

77

콜백을 실행하기 전에 콜백이 실제 함수인지 확인하는 것이 좋습니다.

if (callback && typeof(callback) === "function") {

  callback();
}

21
if(typeof callback == "function")같은 결과가 나옵니다.
Reactgular

22
네, 그러나 콜백이 없다면 왜 타입을 귀찮게합니까? 그 요점은 callback && ...
theonlygusti

61

내 2 센트 동일하지만 다른 ...

<script>
    dosomething("blaha", function(){
        alert("Yay just like jQuery callbacks!");
    });


    function dosomething(damsg, callback){
        alert(damsg);
        if(typeof callback == "function") 
        callback();
    }
</script>

7
나는이 발췌 문장을 좋아한다, 나는 이것을 찾고 있었다
vimal1083

10
function loadData(callback) {

    //execute other requirement

    if(callback && typeof callback == "function"){
        callback();
   }
}

loadData(function(){

   //execute callback

});

6
코드의 기능과 문제를 해결하는 이유에 대한 자세한 설명을 추가하려면 게시물을 수정하십시오. 작동하는 경우에도 대부분 코드 만 포함 된 답변은 OP가 문제를 이해하는 데 도움이되지 않습니다. 그러나이 경우, 이것은 이미 존경받는 답변이 게시 된 매우 오래된 질문이므로 더 많은주의를 기울일 수있는 새로운 질문이있을 때 답변을하는 동안 가치가 없을 수 있습니다.
SuperBiasedMan

1
나는이 답변이 사람들이보고 싶어하는 것에 대한 str8의 앞으로의 시연을 좋아한다.
Aft3rL1f3

5
   function callback(e){
      return e;
   }
    var MyClass = {
       method: function(args, callback){
          console.log(args);
          if(typeof callback == "function")
          callback();
       }    
    }

================================================

MyClass.method("hello",function(){
    console.log("world !");
});

================================================

결과는 다음과 같습니다

hello world !

4

무언가가 완료되었을 때 함수를 실행하려는 경우. 좋은 해결책 중 하나는 이벤트를 듣는 것입니다. 예를 들어, 난을 구현하는거야 Dispatcher하는 DispatcherEvent다음 ES6와 클래스를 :

let Notification = new Dispatcher()
Notification.on('Load data success', loadSuccessCallback)

const loadSuccessCallback = (data) =>{
   ...
}
//trigger a event whenever you got data by
Notification.dispatch('Load data success')

디스패처 :

class Dispatcher{
  constructor(){
    this.events = {}
  }

  dispatch(eventName, data){
    const event = this.events[eventName]
    if(event){
      event.fire(data)
    }
  }

  //start listen event
  on(eventName, callback){
    let event = this.events[eventName]
    if(!event){
      event = new DispatcherEvent(eventName)
      this.events[eventName] = event
    }
    event.registerCallback(callback)
  }

  //stop listen event
  off(eventName, callback){
    const event = this.events[eventName]
    if(event){
      delete this.events[eventName]
    }
  }
}

디스패처 이벤트 :

class DispatcherEvent{
  constructor(eventName){
    this.eventName = eventName
    this.callbacks = []
  }

  registerCallback(callback){
    this.callbacks.push(callback)
  }

  fire(data){
    this.callbacks.forEach((callback=>{
      callback(data)
    }))
  }
}

행복한 코딩!

추신 : 내 코드가 누락되어 일부 오류 예외를 처리합니다.


1
function LoadData(callback) 
{
    alert('the data have been loaded');
    callback(loadedData, currentObject);
}

1

콜백 함수를 호출 할 때 아래와 같이 사용할 수 있습니다.

consumingFunction(callbackFunctionName)

예:

// Callback function only know the action,
// but don't know what's the data.
function callbackFunction(unknown) {
  console.log(unknown);
}

// This is a consuming function.
function getInfo(thenCallback) {
  // When we define the function we only know the data but not
  // the action. The action will be deferred until excecuting.
  var info = 'I know now';
  if (typeof thenCallback === 'function') {
    thenCallback(info);    
  }
}

// Start.
getInfo(callbackFunction); // I know now

이것은 전체 예제 가있는 Codepend 입니다.


1

정답은 이해하기 약간 까다로울 수 있습니다. 평신도 용어의 예는 다음과 같습니다.

var users = ["Sam", "Ellie", "Bernie"];

function addUser(username, callback)
{
    setTimeout(function()
    {
        users.push(username);
        callback();
    }, 200);
}

function getUsers()
{
    setTimeout(function()
    {
        console.log(users);
    }, 100);
}

addUser("Jake", getUsers);

콜백은 사용자 목록을 표시하기 전에 "Jake"가 항상 사용자에게 추가됨을 의미합니다 console.log.

출처 (YouTube)


0

시험:

function LoadData (callback)
{
    // ... Process whatever data
    callback (loadedData, currentObject);
}

함수는 JavaScript 에서 첫 번째 클래스입니다 . 그냥 지나칠 수 있습니다.

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