【问题标题】:Node JS Async requestsNode JS 异步请求
【发布时间】:2015-08-06 12:32:34
【问题描述】:

我有超过 500,000 个 URL 存储在集合(users2)中,例如

{
    "_id" : ObjectId("55c0ae729a9109fc1af36680"),    
    "application_url" : "http://example.com/"
 },
 {
    "_id" : ObjectId("55c0ae729a9109fc1af36685"),    
    "application_url" : "http://example.com/"
 }
 .....

Node JS 服务器必须获取每个文档的“application_url”来更改它并在发出请求之前生成一个新的 url。 它必须按顺序这样做,并且必须等待每个响应才能移动到下一个 URL(当将发出新请求时)。 最终结果(恰好是 JSON)需要存储在一个集合中。

var Promise = require("bluebird");
var request = Promise.promisify(require("request"));

exports.getDetails=function (req,res){

console.log("getDetails");

var sequence = Promise.resolve();

req.db.Users2.find({},{application_url:1,_id:0}).exec().then(function(result) {                       

                        return result.reduce(function(sequence, applicationUrl) {

                            return sequence.then(function() {                             
                                //return applicationUrl;
                                //console.log(applicationUrl.application_url);

                                actualUrl = applicationUrl.application_url;

                                console.log("actualUrl::"+actualUrl);

                                var splitUrl = actualUrl.toString().split('/');
                                var splitid = (splitUrl[5]+"").split('?');
                                var getId = splitid[0];
                                var id = getId.substring(2);
                                var newUrl = splitUrl[0]+'//'+splitUrl[2]+'/'+'lookup?id='+id;

                                //console.log("newUrl::"+newUrl);

                                return newUrl;

                            }).then(function(newUrl) {

                                console.log("newUrl::"+newUrl);     

                                request(newUrl).then(function(response,body){
                                    console.log(JSON.stringify(response));

                                })



                            });
                        }, Promise.resolve());

                }).then(function() {    

                    console.log("Done");

                }).catch(function(err) {

                    console.log("Error");

                })

}

我可以一直工作到新的 url 生成,但不知道如何在使用 Promise 移动到下一个 url 之前发出请求等到收到响应。

【问题讨论】:

    标签: node.js mongodb promise


    【解决方案1】:

    您缺少return。您必须从 then 回调中返回承诺,否则它不会等待它,并立即使用 undefined 解决。

    return result.reduce(function(sequence, applicationUrl) {
        return sequence.then(function() {
            var actualUrl = applicationUrl.application_url;
            console.log("actualUrl::" + actualUrl);
            var splitUrl = actualUrl.toString().split('/');
            var splitid = (splitUrl[5] + "").split('?');
            var getId = splitid[0];
            var id = getId.substring(2);
            var newUrl = splitUrl[0] + '//' + splitUrl[2] + '/' + 'lookup?id=' + id;
    //      return newUrl;           <-- these are pretty superfluous, btw
    //  }).then(function(newUrl) {   <-´
            console.log("newUrl::" + newUrl);
            return request(newUrl).then(function(response, body) {
    //      ^^^^^^
                console.log(JSON.stringify(response));
            })
        });
    }, Promise.resolve());
    

    【讨论】:

      猜你喜欢
      • 2019-02-07
      • 2018-04-26
      • 2017-06-01
      • 1970-01-01
      • 2018-03-15
      • 2016-06-16
      • 1970-01-01
      • 2018-05-15
      • 2017-10-11
      相关资源
      最近更新 更多