【问题标题】:Difference between Promise returns承诺回报之间的差异
【发布时间】:2018-10-03 10:58:56
【问题描述】:

考虑这两个函数:

function a(){
  //...
  if(something) {
    return Promise.resolve();
  } else {
    return Promise.reject();
  }
}  

function b(){
  //...
  return new Promise((resolve, reject) => {
    if(something) {
      resolve();
    } else {
      reject();
    }
  });
}  

我经常遇到第二种方法,但第一种对我来说看起来更干净一些。是否存在任何特定的、罕见的用例,即代码在每种方法中的工作方式都不同,或者仅仅是语义上的?

【问题讨论】:

标签: javascript es6-promise


【解决方案1】:

这两个例子都没有意义,因为代码是同步的。

如果你有一个传统的回调函数,例如setTimeout,你必须使用new Promise将它转换为一个promise(你不能从回调中返回Promise.resolve(value)

const later = (howLong, value) =>
  new Promise(
    resolve =>
      setTimeout(() => {
        console.log(value);
        resolve(value)
      }, howLong)
  );

使用Promise.resolve 可以用作初始值,例如当您异步减少值时:

[1,2,3].reduce(
  (all, item) =>
    all.then(
      () => later(2000, item)
    ),
  Promise.resolve()//initial value of all
)

另一个常见的用例是如果你的函数必须返回一个承诺,但可以立即返回一个值。假设您获取一些数据并在获取时将其缓存。下次您调用该函数时,您希望它返回一个承诺,因为调用者期待一个承诺。您将缓存的值包装在一个承诺中:

const getData = (
  cache => () =>
    (cache)
      ? Promise.resolve(cache)
      : fetch("someURL").then(r=>r.json()).then(result=>{
        cache=result;
        return result;
      })
)(false)

【讨论】:

  • Promise.resolve 的另一个常见示例:一个可能返回缓存数据或异步检索数据的函数,但显然应该保持一个统一接口将使用 return Promise.resolve(data) 返回缓存数据以便始终返回一个承诺。
【解决方案2】:

我能看到的唯一区别是函数 b() 返回 **整个 promise,并且可以从 b 函数的 ** 参数中获取接受和拒绝函数。而函数 a() 是一个预定义的 Promise,它可以被传递到 a() 中,但它的接受和拒绝都是一成不变的,并返回这些函数而不是 Promise 对象。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2018-10-15
    • 2020-10-12
    • 1970-01-01
    • 2017-04-26
    • 2016-05-27
    相关资源
    最近更新 更多