【问题标题】:How do I call three requests in order?如何按顺序调用三个请求?
【发布时间】:2016-09-14 11:33:21
【问题描述】:

我正在学习节点。我有一个控制台应用程序,它必须按顺序向 Web 服务发出请求。具体来说,我需要按顺序提出三个请求。为了提出这些请求,我使用了内置的HTTPS module。我有一个请求成功执行。但是,我需要连续制作三个。我不知道该怎么做。现在,我有:

console.log('Running Request #1...');
var options = {
  host: 'example.com',
  path: '/api/service',
  port: 443,
  method: 'GET',
  headers: {
    'api-key': '[Hidden]'
  }
};

var req = https.request(options, (res) => {
  res.on('data', (d) => {});
});
req.end();

req.on('error', (e) => {
  console.error(e);
});

我不确定如何按顺序调用我的三个请求。然而,与此同时,优雅地处理错误。如果我有承诺,我会知道如何将它们链接在一起并使用catch 处理程序。但是,我不确定如何将请求链接在一起,因为 HTTPS 模块使用箭头函数语法。

感谢任何帮助。

【问题讨论】:

  • 您可以考虑使用回调或承诺将 3 个请求串联起来。对于异步,我建议你看看async#series,承诺你可以看看鬼鬼的答案

标签: javascript node.js


【解决方案1】:

试试这个:

  var https = require('https');
  var urls = ['url1', 'url2', 'url3'];

  var request = function(url) {
    console.log(url);
    return new Promise((resolve, reject) => {
      https.get(url, (res) => {
        res.on('end', () => {
          resolve('what');
        });

        res.on('data', data =>{

        });
      }).on('error', e => {
        reject(e);
      });
    });
  };

  var promise = request(urls.shift());
  while(urls.length > 0) {
    let url = urls.shift();
    promise = promise.then(function() {
      return request(url);
    });
  }
  promise.catch(e => console.log);

【讨论】:

    【解决方案2】:

    考虑将promise与reduce一起使用,类似这样

    var urls=['u1','u2','u3'];
    
    var er=0
    
    function getPromise(url) {
        return new Promise(function (resolve,reject) {
            setTimeout(function () {
                console.log(url+ " is resolved in 2 sec")
                er++
                if(er==1)
                {
                    reject(url)
                }else{
                    resolve(url)
                }
    
    
            },2000)
        })
    }
    
    
    
    urls.reduce(function (pre,cur) {
        return pre.then(function () {
            return getPromise(cur)
        })
    },new Promise(function (resolve,reject) {
        resolve(null)
    }))
    
    .then(function (result) {
        console.log("final result is "+result)
    },function (e) {
        console.log("something wrong happens : "+e)
    })
    

    玩代码,我想这是你想要的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      相关资源
      最近更新 更多