【问题标题】:How to return promise up the chain after recursion递归后如何返回链上的承诺
【发布时间】:2018-01-28 12:42:47
【问题描述】:

我正在发出一个返回分页数据的请求,所以我想递归调用一个函数,直到我拥有所有数据页面,如下所示:

router.get("/", (req, res) => {
    doRequest(1, [])
        .then(result => {
            res.status(200).send(result);
        })
        .catch(error => {
            console.error(error);
            res.status(500).send("Error from request");
        });
});

function doRequest(page, list){
    let options = {
        uri : "www.example.com",
        qs : { "page" : page }
    };
    request(options)
        .then((results) => {
            list.push(results);
            if(page === 2){
                return Promise.resolve(list);
            } else {
                return doRequest(++page, list);
            }
        })
        .catch((error) => {
            return Promise.reject(error);
        });
}

我的路线会立即返回Cannot read property 'then' of undefined,因此doRequest() 显然是立即返回undefined,而不是在列表准备好时返回。我是新的承诺,所以我确定我错过了一些非常简单的东西。

【问题讨论】:

  • doRequest 没有返回任何东西......你的意思是return requestdoRequest 中返回一个你可以.then on 的承诺吗?

标签: javascript recursion promise es6-promise


【解决方案1】:

doRequest函数改为

function doRequest(page, list){
    let options = {
        uri : "www.example.com",
        qs : { "page" : page }
    };
    return request(options)
        .then((results) => {
            list.push(results);
            if(page === 2){
                return Promise.resolve(list);
            } else {
                return doRequest(++page, list);
            }
        })
        .catch((error) => {
            return Promise.reject(error);
        });
}

所以它可以返回请求,它实际上什么也不返回 (undefined)

【讨论】:

  • 好的,谢谢。我陷入了递归问题,以至于我错过了明显的问题!
【解决方案2】:

确实 doRequest 正在返回“未定义”,因为该函数没有返回任何内容。

你那里的返回语句属于'then'和'catch'的谓词,但你在函数doRequest中没有。

你应该返回'request'的结果,它应该是一个承诺,所以你的代码应该是这样的

function doRequest(page, list){
let options = {
    uri : "www.example.com",
    qs : { "page" : page }
};
return request(options)
    .then((results) => {
        list.push(results);
        if(page === 2){
            return Promise.resolve(list);
        } else {
            return doRequest(++page, list);
        }
    })
    .catch((error) => {
        return Promise.reject(error);
    });

}

除此之外,我认为递归处理这不是一个好方法,但这可能是另一个讨论。

【讨论】:

    猜你喜欢
    • 2018-10-11
    • 2023-01-27
    • 2019-05-25
    • 2018-11-07
    • 1970-01-01
    • 2020-01-24
    • 2017-04-02
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多