我有一个承诺,其中包含另一个包含解析器的 API 调用者承诺。现在,当我想使用 .then 作为父承诺时,我无法做到这一点,错误说Cannot read property 'then' of undefined,下面是我的示例代码const getData = () => dispatch => new Promise((resolve) => { return apiService .getByParameter(abc) .then((data) => { dispatch(update({ name: data.name })); resolve(); }) .catch(() => { });});现在每当我尝试做this.getData().then({<--something-->});它会抛出错误Cannot read property 'then' of undefinedgetByParamter 方法来自一个类,如下getByParameter(...params) { const endpoint = `${this.getEndpoint.call(this, ...params)}`; const timeInitiated = performance.now(); return request(() => axios.get(endpoint, extraHeaders), timeInitiated, endpoint, ACTIONS.ACTION_GET); }const request = (rest, timeInitiated, endpoint, action) => new Promise((resolve, reject) => { rest().then(({ data }) => { const timeResolved = performance.now(); const timeCalculated = millisToMinutesAndSeconds(timeResolved - timeInitiated); if (endpoint !== LOGS_ENDPOINT && timeCalculated > MAX_EXECUTION_TIME) { apiLogger.warn(`The endpoint ${endpoint} took ${timeCalculated} seconds for ${action}`); } resolve(data); }) .catch((response) => { if (!isCancel(response)) { reject(response); } else { apiLogger.debug('Request cancelled'); } }); });请建议应该采取什么解决方案来实现我的需要。
2 回答
叮当猫咪
TA贡献1776条经验 获得超12个赞
你的箭头函数立即执行,并且无条件返回另一个函数,而不是承诺!
const getData = () => (dispatch => new Promise(...))
getData()是一个函数,所以.then它不存在。
自己尝试一下
console.assert(typeof getData() !== "function", "`.then` doesn't exist on a function");
老实说,这段代码应该删除调度回调并让被.then调用者使用处理程序,这就是承诺的用途。
const getData = async () => {
const data = await apiService.getByParameter(abc);
return update(data);
});
红颜莎娜
TA贡献1842条经验 获得超12个赞
getData
返回一个需要调度参数的函数。如果你调用该函数,那么你就会得到一个承诺。
const dispatch = useDispatch(); const myPromise = this.getData()(dispatch);
请注意最后一行中的空括号,后跟以调度作为参数的调用()(dispatch)
换句话说,getData
创建一个可用于创建 Promise 的 thunk。
const thunkFunction = getData();const myPromise = thunkFunction(dispatch); myPromise.then(...)
添加回答
举报
0/150
提交
取消