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

Posted

技术标签:

【中文标题】ES6:解析包含其他 Promise 的 Promise,以便父级可以使用 .then【英文标题】:ES6: Resolving Promise containing other Promise so that parent can use .then 【发布时间】:2021-03-16 21:21:03 【问题描述】:

我有一个承诺,其中包含另一个 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');
        
      );
  );

请建议应该是什么解决方案来满足我的需要。

【问题讨论】:

当 Promise 已经存在时不要使用 Promise 构造函数 - 它被称为 ***.com/questions/23803743/… getData() 方法没有返回值。但是你的代码是一个反承诺模式。 @BenjaminGruenbaum 这是否意味着,链接承诺是我应该这样做的方式? @RandyCasburn 我尝试将resolve放在最后,但那部分代码无法访问...... 但是 Redux-Thunk 不会遵循反模式吗?因为最初我的 getData 方法是一个带有调度程序的操作......更新我的代码以获得更广泛的图片 【参考方案1】:

你的箭头函数立即,无条件地返回另一个函数,而不是一个承诺!

const getData = () => (dispatch => new Promise(...))

getData() 是一个函数,所以.then 上不存在。

自己试试

console.assert(typeof getData() !== "function", "`.then` doesn't exist on a function");

老实说,这段代码应该移除 dispatch 回调并让被调用者使用 .then 处理程序,这就是 promise 的用途。

const getData = async () => 
    const data = await apiService.getByParameter(abc);

    return update(data);
);

【讨论】:

更新了我的代码以获得 getByParamter 中的内容 @Noob 好吧现在我们需要知道request 是否返回一个promise。您必须遵循整个控制流链来确定是否返回了 Promise。 是的,then on () => axios.get(endpoint, extraHeaders) 在里面,有问题更新 在意识到 Stuck 所说的之后更新。【参考方案2】:

getData 返回一个需要调度参数的函数。如果您调用该函数,那么您将得到一个承诺。

const dispatch = useDispatch();
const myPromise = this.getData()(dispatch);

注意最后一行中的空括号,后面跟着以 dispatch 作为参数的调用 ()(dispatch)

换句话说,getData 创建了一个 thunk,您可以使用它来创建 Promise。

const thunkFunction = getData();
const myPromise = thunkFunction(dispatch);
myPromise.then(...)

【讨论】:

以上是关于ES6:解析包含其他 Promise 的 Promise,以便父级可以使用 .then的主要内容,如果未能解决你的问题,请参考以下文章

ES6-promise对象的使用

ES6 - Promise 对象

jquery的promise和es6的promise的区别

ES6中对Promise解析

ES6中的Promise深入解析

执行 webpack.config 时出错 - 无法解析“es6-promise”