2015-11-20 47 views
1

我正在嘗試創建一個scraper,但我似乎無法獲得以正確順序執行的代碼。我需要專輯/ albumart請求功能在標題和藝術家功能之後執行。我知道node.js對於這類事情很奇怪,但我試過了所有的東西,但仍然沒有運氣。請求函數在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 

回答

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 
 
    } 
 
})

然而,正如在較早前的答覆建議爲好,這是反模式,並會導致被稱爲厄運或回調的金字塔混亂和雜亂的代碼地獄。

我建議用精彩異步 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 
 
    } 
 
});

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。他們來到ES2015「盒子」。但是如果你使用ES5,你應該爲它們使用一些額外的模塊,如:request-promiseQ

+0

事實是你的。謝謝你的評論。 –

0

JavaScript是異步的。如果請求相互依賴,我建議使用callbacks,這樣當一個請求完成時,它會調用下一個請求。