Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何实现嵌套的节点获取调用?_Node.js_Fetch Api_Node Fetch - Fatal编程技术网

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

Node.js 如何实现嵌套的节点获取调用?,node.js,fetch-api,node-fetch,Node.js,Fetch Api,Node Fetch,例如,我想从一个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/'

例如,我想从一个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()
,然后将其结果传递给
。然后()
。您需要这样做的方式(上面显示的第二个选项)传递一个函数引用,之后promise基础设施可以调用该函数引用

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

.then(function(priorData) {
    return fetch(...).then(...);
});
在调用
.then()
处理程序,然后从
fetch()
返回新承诺,从而将其链接到原始链之前,它不会执行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()
处理程序中,您有两个结果,可以使用它们来制定您的响应。

我明白您的意思。我应该好好读一读这个承诺的东西。最重要的是,当我的服务器收到get请求时,我希望在发送包含其组合数据的响应之前完成两次回迁。@VGambit-然后,您将希望使用我的
Promise.all()
示例(我刚刚修复了其中的一个错误)。