import processAsyncCall from "../helpers/processAsyncCall";
const promiseWrapper = () => new Promise((res, rej) => { /* [1] */ });
const onResolve = () => { /* [2] */ };
dispatch(processAsyncCall(promiseWrapper, onResolve));
promiseWrapper
包含一个承诺,该承诺将在执行特定操作(例如:提取文件,更新内容等)时解决。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
函数。
答案 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
进行调用一样。
诺言只能解决或拒绝一次,此后将永远保持该状态。
解决/拒绝承诺后,其状态将更改为setImmediate
或fulfilled
,并依次调用相应的回调。
在Promise上调用rejected
或then
时,如果Promise的状态为catch
,则回调将添加到相应的列表中。如果Promise已被解决(分别被拒绝),则将在下一个执行循环中调用回调。
我希望它可以帮助您了解此处发生的情况。