Promise返回值的差异

4

考虑这两个函数:

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

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

我更经常使用第二种方法,但是第一种方法对我来说看起来更加简洁。是否存在特定的、罕见的用例,使得每种方法的代码运行不同,或者仅仅是语义上的区别?


如果在 new Promise( 中没有可能抛出异常的逻辑,且其中只有 if 语句,那么两个版本是等价的。 - dfsq
无需解释 - Hyyan Abo Fakher
@dfsq,我不确定第一个函数是否创建了两个对象,但后面的函数只创建了一个。因此第二个函数节省了内存。请澄清一下。谢谢! - Vikasdeep Singh
2个回答

3

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

如果你有一个传统的回调函数,比如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
)

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

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

1
另一个常见的Promise.resolve示例是,一个函数可能会返回缓存的数据或异步检索数据,但显然应该保持一个统一的接口。使用return Promise.resolve(data)返回缓存数据以始终返回一个Promise。 - deceze

0
我能看到的唯一区别是,函数b()返回整个Promise并且可以从b函数的参数中获取accept和reject函数。而函数a()是预定义的Promise,可以传递到a()中,但无论如何它的accept和reject都是固定的,并返回这些函数而不是Promise对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接