JavaScriptのプロミスがプロミス以外の何かを返すようにするにはどうすればよいですか?


38

モジュールのメソッドの実装に関するクライアントからの仕様があります:

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

ジャンルの配列が与えられた場合、

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

約束のあるスケルトンメソッドを次に示します。

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

  return promise;
};

ジャンルで見つかったデータを返すことを約束できますか?仕様の説明を達成するためのより良い方法はありますか?


8
Promiseは値を「返す」のではなく、コールバック(.then()で提供する)に渡します。仕様は単に混乱しているように聞こえます。おそらくresolve([genre1, genre2, ...]);、promise実装内で行うべきだと言っているのでしょう。
Ixrec

回答:


40

約束がどのように使用されているか理解していないようです。あなたは約束を返します。その後、コードがプロミスを解決すると、結果でプロミスが解決され、その結果が.then()プロミスにアタッチされたハンドラーに渡されます。

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
});

5
これにより、約束が期待どおりに機能することが確認されます。
シーローカル

おそらく、あなたはなぜこれが必要なのか理解していないでしょう。React Native with Redux with Realmなどの環境では、初期状態をRedux createStoreに設定する必要があります。Realmから取得する必要がありますが、promiseを返します。これは非常に高速でシンプルなはずなので、データを返すまでブロックしたいだけです。代わりに、Realm
Promise

26

awaitではなくを使用してバージョンを更新しました.then()

awaitPromiseが解決される(つまり、値を持つ)まで実行を停止します。使用とは異なり.then()awaitpromiseを返すさまざまな関数を実行するときに値を保持し続けるだけで、実行は次の行に続きます(これを「直接スタイル」と呼びます)。また、他のJavaScriptと一貫性があるため、他の場所よりもはるかに優れ.then()ています。

// 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()
})()

Awaitは、現在のすべてのブラウザーとノードでサポートされています


1
ああ、すごい見て、このテーマに関する3つのSEの質問、そして最後に実際の答えがあります!
アンドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.