是否有必要在函数中包装Promise?

时间:2018-08-27 13:36:02

标签: javascript redux promise

我有这种情况:

import processAsyncCall from "../helpers/processAsyncCall";

const promiseWrapper = () => new Promise((res, rej) => { /* [1] */ });
const onResolve = () => { /* [2] */ };

dispatch(processAsyncCall(promiseWrapper, onResolve));
  1. promiseWrapper包含一个承诺,该承诺将在执行特定操作(例如:提取文件,更新内容等)时解决。
  2. promise中的promiseWrapper解决后,将调用此方法。

让我们看看processAsyncCall

export default (
  promiseWrapper,
  onResolve = null,
) => (dispatch, getState) => {
  dispatch(showLoading());
  promiseWrapper()
    .then(result => {
      if (onResolve !== null && typeof onResolve === "function") {
        onResolve(dispatch, getState)(result);
      }
    })
    .catch(() => console.log("ERROR_IN_ASYNC"))
    .finally(() => dispatch(hideLoading()));
  });
};

重要的部分是promiseWrapper().then(result => { /* ... */})

我执行功能promiseWrapper以当场创建 Promise


我的问题:

  

是否有必要在一个函数中包装一个Promise,以确保在处理它之前未解决

我遇到了这样的问题:如果我直接将 Promise 作为参数传递,则then回调将不起作用。

dispatch(processAsyncCall(new Promise(/* ... */), /* ... */));

我的理解是,当承诺解决时,将调用then回调。但是,如果函数解析并且当时没有then回调,则 Promise 完成/完成/失效

请记住,上面的示例非常简单,但是在某些情况下, Promise 是在其他地方创建的,并且一直传递到processAsyncCall函数。

2 个答案:

答案 0 :(得分:2)

  

我的理解是,当承诺解决时,将调用then回调。但是,如果函数解析并且当时没有回调,则Promise已完成/已完成/已死。

那是不正确的。根据定义,代码无法知道何时会解决承诺,并且要求代码在解决之前在 之前附加一个回调会给承诺带来很大的限制,并使它们的使用性大大降低。不,您可以随时附加一个新的回调,它将被称为:

const p = new Promise(r => {
    r('yay');
    setTimeout(() => p.then(console.log));
});

p.then(console.log);

您在 情况下的区别可能只是processAsyncCall是希望将promise作为参数还是要返回promise的函数。这些是不同的类型,显然,必须以不同的方式处理。

答案 1 :(得分:2)

我觉得Promise的行为在您的脑海中仍然有些神秘。

您可以将Promise想象成具有4个属性的对象:

  • 一种状态
  • 一个值
  • 在成功的情况下将被调用的回调列表
  • 如果失败将被调用的回调列表。

soup = BeautifulSoup(text, 'html.parser') for outer in soup.find_all('div', class_='outer'): inners = outer.find('div', class_='inner') print(inners.get_text()) 总是从state开始,并且您的promise中的代码会堆叠起来,以便在下一个执行循环中被调用,就像您使用pending进行调用一样。

诺言只能解决或拒绝一次,此后将永远保持该状态。

解决/拒绝承诺后,其状态将更改为setImmediatefulfilled,并依次调用相应的回调。

在Promise上调用rejectedthen时,如果Promise的状态为catch,则回调将添加到相应的列表中。如果Promise已被解决(分别被拒绝),则将在下一个执行循环中调用回调。

我希望它可以帮助您了解此处发生的情况。