You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量调用$http.post链式调用Promise出现previousResponse未定义如何解决

问题根源

你遇到的报错来自两个逻辑缺陷:

  1. reduce传入的初始promise是Promise.resolve(),没有携带任何返回值,第一次进入.then()回调时,参数previousResponse自然为undefined,尝试访问undefined.data就会触发类型错误。
  2. 现有逻辑会漏掉最后一个请求的返回结果:你是在处理完前一个请求的响应后才发起下一个请求,最后一次请求返回后没有对应的逻辑将其结果追加到数组、触发渲染。

修正方案

调整初始promise的返回值,增加对初始状态的判断,最后补一个回调处理最后一个请求的结果即可,修正后代码如下:

function callToHttpPost(request) {
    return $http.post('someurl', request);
}

function outerFunc($scope, someId) {
    let completeArray = [];
    let arrayOfRequests = getRequestInBatches();

    arrayOfRequests.reduce((promiseChain, currentRequest) => {
        return promiseChain.then((previousResponse) => {
            // 初始状态的空返回值不处理
            if (previousResponse) {
                completeArray.push.apply(completeArray, previousResponse.data);
                render($scope, completeArray, someId);
            }
            return callToHttpPost(currentRequest);
        });
    }, Promise.resolve(null))
    // 处理最后一批请求的返回结果
    .then((lastResponse) => {
        completeArray.push.apply(completeArray, lastResponse.data);
        render($scope, completeArray, someId);
    })
    .catch(e => errorHandler($scope, e, someId));
}

这样修改后就可以保证请求按顺序串行发起,每一批返回结果都会及时追加到数组触发渲染,不会出现参数undefined的问题,也不会漏掉最后一批数据。

内容的提问来源于stack exchange,提问作者AmeyaS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:15:04