Cara melewatkan parameter ke fungsi promise


122

pertanyaan ini mungkin tampak konyol, tetapi saya seorang pemula dalam topik ini. Saya sedang mengerjakan promise di node js. Dan saya ingin meneruskan parameter ke fungsi janji. Namun saya tidak bisa memahaminya.

someModule.someFunction.then(username, password,function(uid) {
  /*stuff */
}

dan fungsinya kira-kira seperti itu

var someFunction = new Promise(username, password, function(resolve, reject) {
  /*stuff using username, password*/
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
});

1
Tidak ada alasan untuk melakukan itu, Anda cukup menentukan usernamedan passworddalam lingkup yang lebih tinggi
adeneo

Tetapi saya memanggil janji dari modul lain, dan juga nama pengguna dan kata sandi tidak statis tetapi berasal dari sisi klien. Apakah aman untuk mendefinisikan beberapa jenis variabel gloabal yang ditetapkan oleh satu fungsi dan digunakan oleh fungsi lainnya. Apakah ada risiko variabel diubah oleh klien lain?
kundante

1
@kundante Anda tidak membutuhkan global. Pelajari tentang penutupan.
SLaks

@adeneo the promise is async - bagaimana jika dia memanggil fungsi untuk kedua kalinya sebelum janji pertama diselesaikan?
Mawg mengatakan memulihkan Monica

Jawaban:


234

Bungkus Janji Anda di dalam suatu fungsi atau itu akan mulai melakukan tugasnya segera. Selain itu, Anda dapat mengirimkan parameter ke fungsi:

var someFunction = function(username, password) {
  return new Promise(function(resolve, reject) {
    /*stuff using username, password*/
    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
}

Kemudian, gunakan:

someModule.someFunction(username, password).then(function(uid) {
  /* stuff */
})

 

ES6:

const someFunction = (username, password) => {
  return new Promise((resolve, reject) => {
    /*stuff using username, password*/

    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
};

Menggunakan:

someModule.someFunction(username, password).then(uid => {
  /* stuff */
});

apa someModule?
Si8

3
Itu hanya contoh dari OP
Shanoor

3
@Shanoor Apa uid? Apakah itu string "Barang berhasil!"?
Kakek Tua

2
@OldGeezer, itu hanya variabel untuk menahan pengembalian dari janji. Dalam kasus ini, ya, itu akan menjadi "Semua berhasil!".
Shanoor

apakah Anda tahu cara memanggil fungsi dari kelas induk di dalam promise baru?
TimeParadox

7

Cara lain ( Harus Dicoba ):

var promise1 = new Promise(function(resolve, reject) {
  resolve('Success!');
});
var extraData = 'ImExtraData';
promise1.then(function(value) {
  console.log(value, extraData);
  // expected output: "Success!" "ImExtraData"
}, extraData);


2
Contoh Anda akan lebih baik jika Anda menyelesaikan dengan larik atau objek yang Anda dekonstruksi sehingga beberapa argumen ditampilkan dan janji verbose dibuat sudah diselesaikan seperti: Promise.resolve ([arg1, arg2, arg3]);
pengguna5389726598465

1
Saya pikir itu salah karena parameter kedua yang diteruskan ke thenadalah panggilan balik untuk menangani nilai kembali dari fungsi penolakan . Alih-alih resolve('Success!');mencoba reject('Error');Kami akan mendapatkan kesalahan: Unhandled promise rejectionDi sini kami melihat output karena var extraData = 'ImExtraData';adalah variabel global dan BUKAN karena meneruskannya menggunakanthen
Shakiba Moshiri

Jika Anda tidak lulus, Anda tidak dapat mengaksesnya karena tidak memiliki ruang lingkup yang dijanjikan / maka jika Anda tidak lulus.
sadiq

coba hapus dan lihat apakah berhasil atau tidak? codepen.io/k-five/pen/ZNOvKG lihat log konsol di browser Anda
Shakiba Moshiri

Saya menghargai codepen Anda, tetapi gunakan dua variabel berbeda dan kemudian lihat faktor sebenarnya! HINDARI VARIABEL YANG SAMA. Jika hanya variabel global yang berfungsi dengan baik, kami tidak perlu memberikan parameter tambahan.
sadiq

0

Anda bisa menggunakan .bind () untuk meneruskan param ( ini ) ke fungsi.

var someFunction =function(resolve, reject) {
  /* get username, password*/
  var username=this.username;
  var password=this.password;
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
}
var promise=new Promise(someFunction.bind({username:"your username",password:"your password"}));

saya memiliki fungsi ini bagaimana mengeditnya untuk menerima .then()ketika saya memanggilnya di Tombol ` SaveImagesToFirebase = () => {const uid = firebase.auth (). currentUser.uid; // Penyedia const {images} = this.state; images.map (image => {let file = image.uri; console.log (file); const path = "Img " + Math.floor (Math.random () * 1500); console.log ("@ IMAGE" , jalur); const ref = firebase .storage () .ref ( provider/${uid}/ProviderGalary/${path}); ref.put (file);}); }; `@gogog
DevAS

@DevAS <button onclick = "then_function (SaveImagesToFirebase.bind (this))"> </button> Skripnya adalah `var then_function = function (promise) {new Promise (promise). Lalu (function (e) {/ * code *) /})}; function SaveImagesToFirebase (menyelesaikan, menolak) {/ * kode * / menyelesaikan (/ * ??? * /);} `
gogog

0

Bahkan lebih pendek

var foo = (user, pass) =>
  new Promise((resolve, reject) => {
    if (/* condition */) {
      resolve("Fine");
    } else {
      reject("Error message");
    }
  });

foo(user, pass).then(result => {
  /* process */
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.