Как заставить обещание 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;
};

Можно ли дать обещание вернуть данные, найденные в жанрах? Есть ли лучший способ получить описание спецификации?

sealocal
источник
8
Обещания не «возвращают» значения, они передают их обратному вызову (который вы предоставляете с помощью .then ()). Спецификация просто звучит запутанно для меня. Вероятно, он пытается сказать, что вы должны делать resolve([genre1, genre2, ...]);внутри реализации обещания.
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
});
jfriend00
источник
5
Это подтверждает, что обещания работают так, как я ожидал.
печать
Возможно, вы не понимаете, зачем это нужно. В среде, такой как React Native с Redux с Realm, я должен установить начальное состояние в Redux createStore. Это должно быть получено из Царства, но это возвращает обещание. Я просто хочу заблокировать, пока он не вернет данные, поскольку это должно быть очень быстро и просто. Вместо этого у меня возникают проблемы с объединением обещаний Realm и обычного объекта JSON для createStore ()
likern,
26

Обновленная версия с использованием, awaitа не .then().

awaitпрекращает выполнение до тех пор, пока Обещание не будет разрешено (то есть не будет иметь значения). В отличие от использования, .then()вы можете просто сохранять awaitзначения, когда запускаете различные функции, которые возвращают обещания, и выполнение продолжается на следующей строке (это называется «прямой стиль»). На это также гораздо приятнее смотреть, поскольку он согласуется с остальным 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 поддерживается во всех текущих браузерах и узлах

mikemaccana
источник
1
О, эй, вау, смотри, 3 вопроса SE на эту тему и, наконец, у нас есть актуальный ответ!
Андрей