为了账号安全,请及时绑定邮箱和手机立即绑定

ES6:解析包含其他 Promise 的 Promise,以便父级可以使用 .then

ES6:解析包含其他 Promise 的 Promise,以便父级可以使用 .then

慕妹3242003 2023-10-14 11:11:42
我有一个承诺,其中包含另一个包含解析器的 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);

});


查看完整回答
反对 回复 2023-10-14
?
红颜莎娜

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(...)


查看完整回答
反对 回复 2023-10-14
  • 2 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信