1

例如,我想从 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 调用工作正常,但嵌套调用没有那么多。没有错误消息可以为我指明正确的方向。

4

1 回答 1

2

您必须更改此结构:

.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(...);
});

这在调用处理程序之前不会执行 fetch .then(),然后它会从 中返回新的 Promise 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()处理程序中,您拥有两个结果,并且可以使用它们来制定您的响应。

于 2017-11-09T22:02:43.243 回答