如何使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
承诺不“返回”值,它们将它们传递给回调(您随.then()提供)。规范听起来让我感到困惑。可能是想说您应该resolve([genre1, genre2, ...]);在promise实现中做。
Ixrec 2015年

Answers:


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
这证实了诺言按我预期的方式工作。
sealocal 2015年

可能您不明白为什么需要这样做。在环境中,例如React Real和带有Realm的Redux,我必须将初始状态添加到Redux createStore。应该从Realm中获取它,但是它返回promise。我只想阻止它返回数据,因为这应该非常快速和简单。相反,我遇到了如何将Realm
Promise

26

使用await而不是的更新版本.then()

await停止执行,直到Promise已解决(即具有值)。与使用不同,.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


1
噢,哇,关于这个主题的3个SE问题,最后我们有了一个实际的答案!
安德鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.