我有这种情况:
import processAsyncCall from "../helpers/processAsyncCall";
const promiseWrapper = () => new Promise((res, rej) => { /* [1] */ });
const onResolve = () => { /* [2] */ };
dispatch(processAsyncCall(promiseWrapper, onResolve));
promiseWrapper
包含一个 promise ,该 promise 将在执行特定操作(例如:获取文件、更新内容等)时解析。- 当
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 被解析/拒绝时,其状态将更改为 fulfilled
或 rejected
,并按顺序调用相应的回调。
当你对 Promise 调用 then
或 catch
时,如果 Promise 的状态为 pending
,则回调会添加到相应的列表。如果promise已经被解决(分别被拒绝),回调将在下一个执行循环中被调用。
我希望它可以帮助您了解这里发生的事情。
关于javascript - 是否有必要将 Promise 包装在函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52040661/