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

我有一个承诺,其中包含另一个包含解析器的 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 undefined


getByParamter 方法来自一个类,如下


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');

        }

      });

  });

请建议应该采取什么解决方案来实现我的需要。


慕妹3242003
浏览 102回答 2
2回答

叮当猫咪

你的箭头函数立即执行,并且无条件返回另一个函数,而不是承诺!const getData = () => (dispatch => new Promise(...))getData()是一个函数,所以.then它不存在。自己尝试一下console.assert(typeof getData() !== "function", "`.then` doesn't exist on a function");老实说,这段代码应该删除调度回调并让被.then调用者使用处理程序,这就是承诺的用途。const getData = async () => {&nbsp; &nbsp; const data = await apiService.getByParameter(abc);&nbsp; &nbsp; return update(data);});

红颜莎娜

getData返回一个需要调度参数的函数。如果你调用该函数,那么你就会得到一个承诺。const&nbsp;dispatch&nbsp;=&nbsp;useDispatch(); const&nbsp;myPromise&nbsp;=&nbsp;this.getData()(dispatch);请注意最后一行中的空括号,后跟以调度作为参数的调用()(dispatch)换句话说,getData创建一个可用于创建 Promise 的 thunk。const&nbsp;thunkFunction&nbsp;=&nbsp;getData();const&nbsp;myPromise&nbsp;=&nbsp;thunkFunction(dispatch); myPromise.then(...)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript