Sebuah janji, misalnya:
var P = new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function(){
resolve(a);
}, 3000);
} else {
reject(a);
}
});
Setelah kita panggil, barulah metode yang dijanjikan:
P.then(doWork('text'));
Fungsi doWork terlihat seperti ini:
function doWork(data) {
return function(text) {
// sample function to console log
consoleToLog(data);
consoleToLog(b);
}
}
Bagaimana cara menghindari mengembalikan fungsi dalam di doWork, untuk mendapatkan akses ke data dari parameter teks dan janji? Adakah trik untuk menghindari fungsi batin?
javascript
promise
ecmascript-6
es6-promise
pengguna3110667
sumber
sumber
bind
metode mengerikan ? - yang juga sangat lambat.Jawaban:
Anda dapat menggunakan
Function.prototype.bind
untuk membuat fungsi baru dengan nilai yang diteruskan ke argumen pertamanya, seperti inidan Anda dapat mengubah
doWork
ke,Sekarang,
text
akan benar-benar'text'
masukdoWork
dandata
akan menjadi nilai yang diselesaikan oleh Janji.Catatan: Pastikan Anda memasang penangan penolakan ke rantai janji Anda.
Program kerja: Salinan langsung di REPL Babel
sumber
call
memanggil fungsi di tempat,bind
membuat fungsi baru, namun keduanya menerima konteks eksekusi sebagai argumen pertama mereka.Mungkin jawaban yang paling mudah adalah:
Atau, karena ini diberi tag
ecmascript-6
, menggunakan fungsi panah:Menurut saya ini paling mudah dibaca, dan tidak terlalu banyak untuk ditulis.
sumber
Gunakan kari.
sumber
curriedDoWork
janji dengan melakukanreturn new Promise()
di baris pertama fungsi ini, janji tersebut dijalankan segera setelah Anda memanggilcurriedDoWork()
(seperti yang Anda lakukan di..then(curriedDoWork('text'))
Lodash menawarkan alternatif yang bagus untuk hal ini.
Atau, jika Anda ingin fungsi sukses hanya memiliki satu parameter (hasil janji yang terpenuhi), Anda dapat menggunakannya dengan cara ini:
Ini akan melekat
text: 'myArgString'
padathis
konteks di dalam fungsi.sumber
Jawaban baru untuk pertanyaan ini adalah dengan menggunakan fungsi panah, yang secara otomatis mengikat 'ini' dan jauh lebih mudah dibaca. Google untuk tautan seperti: https://2ality.com/2016/02/arrow-functions-vs-bind.html
Anda bisa mengatur teks seperti ini: this.text = 'text' P. lalu (data => doWork (data)); //this.text di dalam doWork akan dievaluasi menjadi 'text'.
Ini disarankan oleh jib di atas dan bahwa (atau ini!) Harus menjadi jawaban yang diterima sekarang.
sumber