如何实现嵌套的节点获取调用?

How can I implement nested node-fetch calls?

例如,我想从 API(用户)检索一些数据,以便我可以检索更多数据(与该用户关联的团队)。类似于:

var fetch = require('node-fetch');

app.get('/users/:username', function (req, res) {   
    var username = req.params.username;
    var user = new Object();
    fetch('https://api.github.com/users/' + username)
    .then(function(res) {
        return res.json();
    }).then(function(json) {
        console.log(json);

        user.handle = json.login;
    }).then(fetch('https://api.github.com/users/' + username + '/repos')
        .then(function(res) {
            return res.json();
        }).then(function(json) {
            console.log(json);
            //user.repos = repos
            var payload = new Object();
            payload.user = user;
            console.log(payload);
            res.send(payload);
        })
    );
});

我是 Node 的新手,不知道如何正确地执行此操作。第一个 fetch 调用工作正常,但嵌套的调用效果不佳。没有错误消息为我指明正确的方向。

你必须改变这个结构:

.then(fetch('https://api.github.com/users/' + username + '/repos').then(...))

对此:

.then(() => fetch('https://api.github.com/users/' + username + '/repos').then(...))

您这样做的方式是立即调用 fetch(),然后将其结果传递给 .then()。您需要执行此操作的方式(上面显示的第二个选项)传递一个函数引用,然后可以由 promise 基础结构稍后调用该函数引用。

为了更详细地向您展示实际发生的情况,这是您想要的结构:

.then(function(priorData) {
    return fetch(...).then(...);
});

在调用 .then() 处理程序之前不会执行提取,然后它 returns 来自 fetch() 的新承诺,从而将其链接到原始链中。此答案中第二个代码块中显示的箭头函数示例实现了与最后一个代码块相同的效果。


作为一般性评论,您对 fetch() 的两次调用并不相互依赖,因此您可以 运行 同时并行调用它们,这可能会让您更快结束结果。

一般方案是:

Promise.all([fetch(url1), fetch(url2)]).then(function(results) {
    // results[0] is result of first fetch
    // results[1] is result of second fetch
});

然后,在那个 .then() 处理程序中,您将获得两个结果并可以使用它们来制定您的响应。