2017-09-24 37 views
-1

我想設置一個快速服務器,返回項目數組查詢的結果。我已閱讀this question,我可以用Promise.each這個...如何使用Promise發送請求結果數組?

我打算我的代碼做的是:

  • 網頁刮一個網頁,電影列表,並返回標題爲數組。
  • 使用電影的標題做一個API的請求,對每個
  • 返回與API響應每一部電影

這裏的結果給客戶端的響應是我的代碼:

var express = require('express'); 
var app = express(); 

var Xray = require('x-ray'); 
var x = Xray(); 

app.get('/', function (req,res){ 
    var username = 'medicengonzo'; 
    var pages = 3; 

    x('https://letterboxd.com/'+username+'/watchlist/', 'li.poster-container', [{ 
      movie: '[email protected]' 
      }])(function (err,results){ 
     console.log('Entered x-ray callback fn'); 
     results.forEach(function(result, index){ 
      console.log('Iteration'); 
      console.log(results.length); 
      request('http://netflixroulette.net/api/api.php?title='+encodeURIComponent(result.movie), 
        function(err, response, body){ 
         movies = []; 
         console.log(count); 
         obj = JSON.parse(body); 
         if(obj.errorcode != 404){ 
          movies.push('Movie found: '+obj.show_title, 'ID: '+obj.show_id); 
         } 
         else{ 
          movies.push('No movie found'); 
         } 
          res.send(movies); 
        } 
      ); 
     }); 
    }) 
    .paginate('.paginate-current+li [email protected]') 
    .limit(pages); 
}); 

app.listen(3000, function(){ 
    console.log('Listening on port 3000!'); 
}); 
+0

你的意思是Promise.all? –

+0

目前尚不清楚你的代碼打算做什麼。現在,您正在'results.forEach()'循環內執行一個'res.send(movies)',因此您可以多次執行相同的請求,這絕對是編碼錯誤,只有第一個作爲迴應發送。那麼,你應該發送什麼結果作爲迴應? – jfriend00

+0

@BorisCharpentier我對承諾是新的,所以我不太明白'Promise.all'如何工作... – medicengonzo

回答

0

所以...有點谷歌搜索和大量的學習承諾和鏈接承諾我以後工作代碼:

var express = require('express'); 
var app = express(); 

var Xray = require('x-ray'); 
var x = Xray(); 

var Promise = require('bluebird'); 
var request = require('request'); 

var debug = true; 

app.get('/', function (req,res){ 

    if(debug) console.log('Page requested!'); 

    var username = 'medicengonzo'; 
    var pages = 3; 

    var scrapeMovies = function(){ 
     if(debug) console.log('scrapeMovies()'); 
     return new Promise((resolve,reject) => { 
      x('https://letterboxd.com/'+username+'/watchlist/', 'li.poster-container', [{ 
        title: '[email protected]' 
        }])((err, results) => { 
        console.log('x()'); 
       if(err) reject(err); 
       resolve(results); 
      }) 
      .paginate('.paginate-current+li [email protected]') 
      .limit(pages); 

     }); 
    }; 

    scrapeMovies().then(
      movies => { 
     if(debug) console.log('scrapeMovies() resolved'); 
     return new Promise.all(movies.map((movie, index) => { 
      return new Promise((resolve, reject)=> { 
       if(debug) console.log('Requesting: ', movie.title); 
       request('http://netflixroulette.net/api/api.php?title='+encodeURIComponent(movie.title), (err, response, body) => { 
         if(debug) console.log('Flixroulette requested'); 
         var flixMovie = JSON.parse(body); 
         if(flixMovie.errorcode != 404){ 
          resolve('Movie found: '+flixMovie.show_title, 'ID: '+flixMovie.show_id); 
         } 
         else{ 
          resolve('No movie found...'); 
         } 
       }); 
      }); 
     })); 
    }).then((movies) => res.send(movies)).catch((err) => console.log(err)); 

}); 

app.listen(3000, function(){ 
    console.log('Listening on port 3000!'); 
}); 

首先,我定義了一個函數,用於刮取我需要的電影標題,並返回一個包含所有標題數組的承諾:scrapeMovies()

之後,我將承諾鏈接到另一個承諾,該承諾包含將爲我提出請求的函數。而不是array.forEach我使用array.map,以便它返回一個promise數組,每個使用來自請求的數據進行解析,並在結尾處獲得來自Promise.all()的解析數據,該數據是包含所有數據的數組。