Bagaimana cara membuat janji JavaScript mengembalikan sesuatu selain janji?

38

Saya memiliki spesifikasi dari klien untuk implementasi metode dalam modul:

 // getGenres():
 //  Returns a promise. When it resolves, it returns an array.

Jika diberi berbagai genre,

['comedy', 'drama', 'action']

Berikut adalah metode kerangka dengan janji:

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
  });

  return promise;
};

Bisakah janji dibuat untuk mengembalikan data yang ditemukan dalam genre? Apakah ada cara yang lebih baik untuk mencapai deskripsi spesifikasi?

sealocal
sumber
8
Janji tidak "mengembalikan" nilai, mereka meneruskannya ke panggilan balik (yang Anda berikan .then ()). Spek itu terdengar membingungkan bagi saya. Mungkin mencoba untuk mengatakan bahwa Anda seharusnya melakukannya resolve([genre1, genre2, ...]);di dalam implementasi janji.
Ixrec

Jawaban:

40

Sepertinya Anda tidak mengerti bagaimana janji digunakan. Anda mengembalikan janji. Kemudian, nanti ketika kode Anda menyelesaikan janji, itu menyelesaikannya dengan hasil dan hasil itu diteruskan ke .then()pawang yang terlampir pada janji:

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
    resolve(result);
  });

  return promise;
};

MovieLibrary.getGenres().then(function(result) {
    // you can access the result from the promise here
});
pacar00
sumber
5
Ini menegaskan bahwa janji bekerja seperti yang saya harapkan.
sealocal
Mungkin, Anda tidak mengerti mengapa ini mungkin diperlukan. Di lingkungan, seperti Bereaksi Asli dengan Redux dengan Realm, saya harus meletakkan status awal ke Redux createStore. Itu harus diambil dari Realm, tetapi mengembalikan janji. Saya hanya ingin memblokir sampai mengembalikan data karena ini harus sangat cepat dan sederhana. Alih-alih, saya mendapatkan masalah bagaimana menggabungkan janji Realm dan objek JSON biasa untuk createStore ()
likern
26

Versi yang diperbarui menggunakan awaitdaripada .then().

awaitberhenti mengeksekusi sampai Janji telah terselesaikan (yaitu, memiliki nilai). Tidak seperti menggunakan .then()Anda hanya bisa menyimpan awaitnilai ketika Anda menjalankan berbagai fungsi yang mengembalikan janji, dan eksekusi berlanjut ke baris berikutnya (ini disebut 'gaya langsung). Ini juga jauh lebih baik untuk dilihat, karena ini konsisten dengan sisa JavaScript, daripada di .then()mana - mana.

// Example function that returns a Promise that will resolve after 2 seconds
var getGenres = function() {
  return new Promise(function(resolve) {
    setTimeout(function(){
      resolve(['comedy', 'drama', 'action'])
    }, 2000);
  });
}

// We start an 'async' function to use the 'await' keyword
(async function(){
  var result = await getGenres()
  console.log('Woo done!', result)

  // But the best part is, we can just keep awaiting different stuff, without ugly .then()s
  var somethingElse = await getSomethingElse()
  var moreThings = await getMoreThings()
})()

Menunggu didukung di semua browser dan node saat ini

mikemaccana
sumber
1
Oh hey wow, 3 SE pertanyaan tentang hal ini dan akhirnya kami memiliki jawaban yang sebenarnya!
Andrew