Pertanyaan Fungsi panggilan balik Javascript dengan parameter [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Pertanyaan ini terlihat seperti duplikat, karena judul hampir direplikasi. Namun, masalah saya tampak lebih sederhana dan saya tidak dapat menemukan jawabannya.

Saya memiliki fungsi Javascript yang menjalankan fungsi panggilan balik lain, ia berfungsi seperti ini:

<script type='text/javascript'>
firstfunction(callbackfunction);
</script>

di mana fungsi callback didefinisikan sebagai:

callbackfunction(response) {
    if (response=='loggedin'){
    // ... do stuff
}}

tapi saya ingin menjadi seperti ini:

callbackfunction(response, param) {
    if (response=='loggedin'){
    // ... do stuff with param
}}

Pertanyaan saya adalah, apakah berfungsi untuk meneruskan parameter seperti ini:

<script type='text/javascript'>
firstfunction(callbackfunction(param));
</script>

atau saya melakukan kesalahan?


13
2017-10-22 01:11


asal


Jawaban:


Dalam jawaban langsung atas pertanyaan Anda, ini tidak berhasil:

 firstfunction(callbackfunction(param));

Itu akan dieksekusi callbackfunction segera dan berikan nilai kembalinya dari mengeksekusinya sebagai argumen firstfunction yang tidak mungkin apa yang kamu inginkan.


Tidak jelas dari pertanyaan Anda apakah Anda seharusnya berubah saja firstfunction() untuk melewati dua parameter ke callbackfunction() ketika memanggil callback atau apakah Anda harus membuat fungsi anonim yang memanggil fungsi panggilan balik dengan argumen.

Kedua opsi ini akan terlihat seperti ini:

function firstfunction(callback) {
    // code here
    callback(arg1, arg2);
}

firstfunction(callbackfunction);

atau

function firstfunction(callback) {
    // code here
    callback();
}

firstfunction(function() {
    callbackfunction(xxx, yyy);
});

24
2017-10-22 01:57



Gunakan fungsi anonim:

function foo( callback ) {
  callback();
}

function baz( param ) {
  console.log( param );
}

foo( function(){ baz('param') });

7
2017-10-22 01:16



Menambahkan parameter saat memanggil suatu fungsi. https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply

xdaz sudah menjawab versi sederhana. Berikut ini contoh dengan jumlah parameter yang bervariasi.

function someObject(){
        this.callbacks=new Array();
        this.addCallback=function(cb){
            this.callbacks[this.callbacks.length]=cb
        }
        this.callCallbacks=function(){
            //var arr=arguments; this does not seem to work
            //arr[arr.length]="param2";
            var arr = new Array();
            for(i in arguments){
                arr[i]=arguments[i];
            }
            arr[arr.length]="another param";
            i=0;
            for(i in this.callbacks){
                this.callbacks[i].apply(null,arr);
                //this.callbacks[i].apply(this,arr);
                //this is a ref to currrent object
            }
        }
        this.callCallbacksSimple=function(arg){
            for(i in this.callbacks){
                this.callbacks[i](arg,"simple parameter");
            }

        }
}
function callbackFunction(){
    for(i in arguments){
        console.log("Received argument: " + arguments[i]);
    }
}
var ObjectInstance=new someObject();
ObjectInstance.addCallback(callbackFunction);
ObjectInstance.callCallbacks("call callbacks");
ObjectInstance.callCallbacksSimple("call callbacks");

2
2017-10-22 02:17



function adalah kata kunci, Anda tidak dapat menggunakannya sebagai nama fungsi.

Katakanlah nama fungsi Anda foo, maka Anda bisa melakukan seperti di bawah ini:

var param = 'what ever';
foo(function(response) {
  callbackfunction(response, param);
});

1
2017-10-22 01:15



Saya pikir ini yang Anda cari. 

Katakanlah Anda menggunakan jQuery ajax untuk melakukan sesuatu, dan Anda meneruskannya dengan nama callback. Di sini kami memiliki callback onError yang mungkin Anda gunakan untuk mencatat atau menangani kesalahan dalam aplikasi Anda. Ini sesuai dengan jQuery Ajax error callback signature, kecuali untuk parameter ekstra yang mungkin ingin Anda tambahkan di bagian belakang

function onError(jqXHR, textStatus, errorThrown, yourOwnVariableThing) {
    console.error('Something went wrong with ' + yourOwnVariableThing);
}

ini adalah tempat fungsi Anda akan dipanggil - tetapi Anda menginginkan parameter tambahan

$.ajax("/api/getSomeData/")
 .done(onDone)
 .fail(onError) 
 .always(onComplete);

Jadi ini yang dapat Anda lakukan untuk menambahkan parameter ekstra

$.ajax("/api/getSomeData/")
  .done(onDone)
  .fail(onError.bind(this, arguments[0], arguments[1], arguments[2], 'Moo Moo'); 
  .always(onComplete);

arguments adalah larik dalam JavaScript yang berisi semua argumen yang dilewatkan ke suatu fungsi, sehingga Anda hanya meneruskan argumen tersebut untuk panggilan balik.

Argumen

Mengikat


1
2017-07-20 09:23