8

I would like to return value from anonymous function. How can I assign returned value to $id variable in below code ?

$(document).on("click", '.delete-component', function(e) {
     return 4;
 });

 //$id in this scope should be equal 4
Thomas Shelby
  • 1,340
  • 3
  • 20
  • 39
  • You cannot assign it to anything before the click has happened. No, you [cannot `return` a value from an asynchronous callback](http://stackoverflow.com/q/23667086/1048572). – Bergi Dec 02 '14 at 13:15
  • Event callback will be called on click, but you can't assign its result. However you can make some assignments *inside* of it. – dfsq Dec 02 '14 at 13:16
  • What are you going to do with the return value? – Sampath Liyanage Dec 04 '14 at 14:51

2 Answers2

4

You need to specify what to do when asyn function or operation is reached, so usually a return when using callbacks is another callback...

function aux(param1, callback){
    // do whatever...
    $(document).on("click", param1, function(e) {
        // return 4;
        callback(4);
    });
}

and you would use it in you code as following:

// your context..
// operations 1.. 2..
aux('.delete-component', function(theReturnedValue){
    console.log(theReturnedValue); // 4
});

This is how callbacks 'return' values to an outer scope.

rahpuser
  • 1,224
  • 10
  • 31
2

One thing you have to be aware that you work here with asynchronous actions. Let's number lines in order of exaction (n means some high number far far later)

1]    $(document).on("click", '.delete-component', function(e) {
n+1]    return 4;
      });
2]    console.log('here');

What you did was attached listener to click. Click won't happen at the moment - it will happen when someone clicks. Therefore you will have access to it after click happens. You can do two things:

  1. Declare var in scope above.
  2. Forward value to callback

1) Example 1

var myValue = 0;
$(document).on("click", '.delete-component', function(e) {
     myValue = 4;
});

function abc() {
  console.log('myValue is equal to ' + myValue);
}

// if that line happen before clicking, value will be still 0
execture somewhen abc();

2) Example 2

$(document).on("click", '.delete-component', function(e) {
     doSomethingWithValue(4);
});

function doSomethingWithValue() {
  console.log('myValue is equal to ' + myValue);
}

You can also investigate $watch, especially Angular does here a lot work for you.