web-dev-qa-db-ja.com

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

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

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

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

42
sealocal

約束がどのように使われているか理解していないようです。あなたは約束を返します。その後、コードがpromiseを解決するときに、結果で結果が解決され、その結果がpromiseにアタッチされた.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
});
45
jfriend00

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

awaitは、Promiseが解決される(つまり、値を持つ)まで実行を停止します。 .then()を使用する場合とは異なり、promiseを返すさまざまな関数を実行するときにawaitingの値を保持するだけで、実行は次の行に続きます(これは「ダイレクトスタイル」と呼ばれます)。また、どこでも.then()よりもJavaScriptの残りの部分と一貫しているので、muchを見ると見やすくなります。

// 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は現在のすべてのブラウザーとノードでサポートされています

34
mikemaccana