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

标签 javascript redux promise

我有这种情况:

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

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

dispatch(processAsyncCall(promiseWrapper, onResolve));
  1. promiseWrapper 包含一个 promise ,该 promise 将在执行特定操作(例如:获取文件、更新内容等)时解析。
  2. promiseWrapper 内的 promise 已解析时,将调用此方法。
<小时/>

让我们看一下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当场

<小时/>

我的问题:

Is it necessary to wrap a promise in a function to ensure that it is not resolved before it is processed?

我遇到了这个问题,如果我直接将 Promise 作为参数传递,then 回调将无法工作。

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

我的理解是,当promise解析时,then回调被调用。但是,如果函数解析并且当时没有 then 回调,则 Promise完成/完成/死亡

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

最佳答案

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

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

  • 一个州,
  • 一个值,
  • 成功时将调用的回调列表,
  • 失败时调用的回调列表。

state 始终从 pending 开始,并且您的 Promise 中的代码将被堆叠起来,以便在下一个执行循环中调用,就像您使用 调用它一样设置立即

Promise 只能解析或拒绝一次,并且此后将永远保持该状态。

当 Promise 被解析/拒绝时,其状态将更改为 fulfilledrejected,并按顺序调用相应的回调。

当你对 Promise 调用 thencatch 时,如果 Promise 的状态为 pending,则回调会添加到相应的列表。如果promise已经被解决(分别被拒绝),回调将在下一个执行循环中被调用。

我希望它可以帮助您了解这里发生的事情。

关于javascript - 是否有必要将 Promise 包装在函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52040661/

相关文章:

javascript - Ext JS 6 - 尽管包含 ext-all.js 但未找到图表

javascript - 处理 promise 链中的多个捕获

javascript - 尝试将 redux 集成到 React 应用程序中。 Webpack 对 store.js 感到窒息

react-native - withNavigation 只能用于导航器的 View 层次结构

javascript - 创建可重用的 promise 链并将其应用到其他 promise 上

promise - RxJs 缓冲直到数据库插入( promise )

javascript - 如何重定向来自ajax请求的响应

node.js - 如何从meteor.js 中的FTP url 获取?

javascript - 输入 iframe 在第二次点击 ionic v1 中停止在 IOS 上工作

javascript - React hooks、函数组件和 Redux