如何让nodejs的多个http请求全部响应回来后才让程序往下走

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让nodejs的多个http请求全部响应回来后才让程序往下走相关的知识,希望对你有一定的参考价值。

参考技术A eateServer(function (req, res)
res.writeHead(200, 'Content-Type': 'text/plain' )
res.end('Hello World\n')
)
.listen(3000, function () console.log('Listening on port 3000') )
$ curl localhost:3000
Hello World

就这么简单,因为 Node.js 把许多细节都已在源码中封装好了,主要代码在 lib/_http_*.js 这些文件中,现在就让我们照着上述代码,看看从一个 HTTP 请求的到来直到响应,Node.js 都为我们在源码层做了些什么。本回答被提问者采纳

Angular 承诺使用多个 http 请求

【中文标题】Angular 承诺使用多个 http 请求【英文标题】:Angular promises using multiple http requests 【发布时间】:2014-05-30 14:44:16 【问题描述】:

我之前已经阅读了一些关于 Angular Promise 的论坛帖子,但无法让它在我的实例中发挥作用。我在后端使用 nodejs /locomotive,前端使用 Angular。

我在控制器中有以下代码,基本上我想使用 slides.path 的路径,我将如何使用 Promise 来执行此操作?任何帮助将不胜感激。

function ProductCtrl($scope, $http, $q) 

    $scope.events = [];
    $scope.times = [];

    var html = [];
    var chapters = [];
    var path;

    //var paPromise = $q.defer();

    $http(
        url: '/show',
        method: 'GET',
        params:  eventid:$scope.$routeParams.eventid

    ).success(function(response, code) 

        $scope.events = response;

        angular.forEach($scope.events.slides, function(slide) 

            $http(
                url: '/upload',
                method: 'GET',
                params: uploadid: slide.upload.toString()

            ).success(function(response, code) 
                return "http://www.example.com/"+response.path;

            ,path);

            slide.path = path;

            chapters.push(slide);

        );

    );

【问题讨论】:

你是带着承诺去做的。 $http 返回一个promise,并且只有在promise 被解决时才调用success 调用。你到底有什么问题? 除非您想使用完整的 FRP 或启用旧版自动展开模式。我不确定你想要完成什么。 【参考方案1】:

您可以使用 $q.all 来完成这个多重承诺问题。像这样:

function ProductCtrl($scope, $http, $q) 

$scope.events = [];
$scope.times = [];

var html = [];

var path;

function fetchChapter() 
    var chapters = [];

    var httpPromise = $http(
        url: '/show',
        method: 'GET',
        params: 
            eventid: $scope.$routeParams.eventid
        
    );

    //Return the value http Promise
    return httpPromise.then(function (response) 
        $scope.events = response;
        var promises = [];
        angular.forEach($scope.events.slides, function (slide) 

            var inPromise = $http(
                url: '/upload',
                method: 'GET',
                params: 
                    uploadid: slide.upload.toString()
                
            ).then(function (response, code) 
                //each promise makes sure, that he pushes the data into the chapters
                slide.path = "http://www.example.com/" + response.path;
                chapters.push(slide);
            );
            //Push the promise into an array
            promises.push(inPromise);
        );
        //return the promise from the $q.all, that makes sure, that all pushed promises are ready and return the chapters.
        return $q.all(promises).then(function () 
            return chapters;
        );
    );


fetchChapter().then(function(chapters)
   //populate here 
);

httpPromise 将从 $q.all 返回承诺。

编辑:那么如何获取数据 包装一个函数,我用fetchChapter 做了一个函数并将一个函数传递给then 会有你需要的值作为参数。

【讨论】:

嗯。为什么不从承诺中返回chapter?您可以简单地将切片映射到它们上的承诺。 缺少“s” ^^ chapters.push(slide) 感谢您的回复,我将如何使用 var 章节来填充 httpromise 之外的 div 成功了,我开始理解承诺,酷,干杯

以上是关于如何让nodejs的多个http请求全部响应回来后才让程序往下走的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS 通过请求函数加入承诺

nodejs http请求,req.abort和re.destory的区别是啥

NodeJS在某些任务后发送响应

如何从 POST 请求中检索 cookie?

nodejs的http模块不是能够立即接收/发送整个请求/响应吗?

nodejs - 在其他请求后无法响应[重复]