Promise回报之间的区别

时间:2018-04-23 11:47:52

标签: javascript es6-promise

考虑这两个功能:

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

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

我经常遇到第二种方法,但第一种看起来对我来说更清洁。当代码与每种方法的工作方式不同时,是否有任何特定的,罕见的用例,或者它只是语义?

2 个答案:

答案 0 :(得分:3)

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

如果你有传统的回调功能,例如setTimeout,你必须使用new 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 :(得分:0)

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