请求函数在node.js

时间:2015-11-20 05:19:23

标签: javascript node.js

我正在尝试制作一个刮刀,但我似乎无法让代码以正确的顺序执行。我需要在标题和艺术家功能之后执行相册/ albumart请求功能。我知道node.js对于这类事情很奇怪,但我已经尝试过所有的东西,但仍然没有运气。

Here's the Code

请原谅这个烂摊子和多余的调试代码。

当前输出:

TESTED!!!
req
No error
Pentemple - Pazuzu 2
Now Playing: Pentemple - Pazuzu 2
10
Pentemple
10
Pentemple
1
{ artist: '',
  title: '',
  album: '',
  albumArt: '',
  testval: 'TESTED!!!' }
xtest

3 个答案:

答案 0 :(得分:0)

在大多数情况下,在Javascript中执行请求具有异步性质。这意味着请求不会阻止整个过程。在请求完成时执行和操作,使用回调。回调是在请求进入完成状态后添加到事件循环队列中的函数。最简单的方法(但肯定不是最好的方法)让reqeust一个接一个地运行是在第一个回调中调用第二个请求,在第二个回调中调用第三个请求,依此类推。

 request(profileurl, function (error, response, html) {
    console.log("req");
    if (!error) {
         // ...
         request(albumurl, function (error, response, html) { 
             if (!error) {
             // ...
             request(albumurl, function (error, response, html) {
             // ...
             });
         });
    } else {
        console.log("ERROR: " + error);
    }
});

但是这种做法被认为是反模式的,被称为Pyramid of Doom,因为嵌套回调会使代码难以理解,难以测试且难以维护。

良好做法被视为使用promises。他们来到盒子里#34;与ES2015。但是如果您使用ES5,则应该为它们使用一些额外的模块,例如:request-promiseQ

答案 1 :(得分:0)

JavaScript是异步的。如果请求相互依赖,我建议使用callbacks,这样当一个请求完成后,它会调用下一个请求。

答案 2 :(得分:0)

由于异步请求调用,响应可能不是为了保持顺序,因此您需要在先前请求的回调中进行下一个请求调用。以下是相同的例子 -

request(url1, function(err, res, html){
  if(!err)
  {
    // url1 successfully returned , call another dependent url
    request(url2, function(err2, res2, html2){
      if(!err2)
      {
        // url2 successfully returned,  go on with another request call and so on ... 
      }
    });
  }
  else
  {
    // first call failed, return gracefully here --
    callback(err); // if you have any
  }  
})

然而,正如之前的回答中所建议的那样,这是反模式,并将导致混乱或混乱的代码被称为厄运或回调地狱的金字塔。

我建议使用精彩的 async npm模块,然后将相同的代码写成 -

var async = require('async');

async.waterfall([
    function(callback) {
        request(url1, function(error, res, html){
          
           callback(null, res, html);  
          
        });
        
    },
    function(res1, html1, callback) {
       
         request(url1, function(error, res, html){
          
           callback(null, res1, html1, res, html);  
          
        }); 
        
    } // ... AND SO ON
    
], function (err, result) {
  
  // the result contains the response sent by the last request callback
  if(!err)
  {
    // use your data 
  }
});