2016-06-16 2 views
0

팁 : D. 여기 내 코드입니다 :내 nodejs 스크립트에 문제가 있습니다.

const request = require('request'); 
const cheerio = require('cheerio'); 

function getUrls(url) { 
    const baseUrl = 'https://unsplash.com'; 
    let urls = []; 
    request(url, (err, res, body) => { 
     if (!err && res.statusCode === 200) { 
      const $ = cheerio.load(body, { normalizeWhitespace: false, xmlMode: false, decodeEntities: true }); 
      $('.photo.qa-photo a').each((i, e) => { 
       const lnk = $(e).attr('href'); 
       if (lnk.indexOf('@') === -1 && lnk.indexOf('download') === -1) { 
        urls.push(baseUrl + lnk); 
       } 
      }); 
     } 
    }); 
    return urls; 
} 

function getImages(arr) { 
    let images = []; 
    for (const url of arr) { 
     request(url, (err, res, body) => { 
      if (!err && res.statusCode === 200) { 
       const $ = cheerio.load(body, { normalizeWhitespace: false, xmlMode: false, decodeEntities: true }); 
       $('script').each((i, e) => { 
        if (i === 4) { 
         let img = $(e).text(); 
         img = img.substring(img.indexOf('full') + 7, img.indexOf('regular') - 3); 
         images.push(img); 
        } 
       }); 
      } else { 
       console.log(err, res.statusCode); 
      } 
     }); 
    } 
    return images; 
} 

console.log(getImages(getUrls('https://unsplash.com/search?utf8=%E2%9C%93&keyword=life&button='))); 

별도로 기능이 잘 작동,하지만 난 두 기능을 결합하려면 먼저 기능이 작업을 완료하지만 난 반환 된 배열을 볼 수 없습니다 나에게 하늘의 배열을 보여 CONSOLE.LOG, 왜? 내 영어로 미안해. 이 작은 프로그램으로 나는 unsplash.com에서 20 이미지의 전체 URL을 얻고 싶습니다 타이.

+0

가능한 복제본 [비동기 호출의 응답을 어떻게 반환합니까?] (http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous- 전화) –

답변

0

자바 스크립트는 비동기 언어입니다. 여기서 일어나는 일은 getImages 함수가 getUrls 함수가 완료 될 때까지 대기하지 않는다는 것입니다.

getImages 함수에서 콜백 또는 약속을 사용해야하므로 getUrls을 기다립니다.

Here의 약간의 튜토리얼 콜백

에 콜백 자바 스크립트에서 정말 중요한 개념이며, 나는 강력하게 작동하는 방법 당신이 배울 것이 좋습니다. 그것은 당신의 삶을 편하게 해줄 것입니다. 약속도 마찬가지입니다.

는 여기에 내가 그것을 테스트하지 않은 코드

const request = require('request'); 
const cheerio = require('cheerio'); 

// callback is the function to be called when this one finishes 
function getUrls(url, callback) { 
    const baseUrl = 'https://unsplash.com'; 
    let urls = []; 
    request(url, (err, res, body) => { 
     if (!err && res.statusCode === 200) { 
      const $ = cheerio.load(body, { normalizeWhitespace: false, xmlMode: false, decodeEntities: true }); 
      $('.photo.qa-photo a').each((i, e) => { 
       const lnk = $(e).attr('href'); 
       if (lnk.indexOf('@') === -1 && lnk.indexOf('download') === -1) { 
        urls.push(baseUrl + lnk); 
       } 
      }); 
     } 
    }); 
    //Notice the call to callback. 
    callback(urls); 
} 
function getImages(arr) { 
    let images = []; 
    for (const url of arr) { 
     request(url, (err, res, body) => { 
      if (!err && res.statusCode === 200) { 
       const $ = cheerio.load(body, { normalizeWhitespace: false, xmlMode: false, decodeEntities: true }); 
       $('script').each((i, e) => { 
        if (i === 4) { 
         let img = $(e).text(); 
         img = img.substring(img.indexOf('full') + 7, img.indexOf('regular') - 3); 
         images.push(img); 
        } 
       }); 
      } else { 
       console.log(err, res.statusCode); 
      } 
     }); 
    } 
    return images; 
} 

console.log(getUrls('https://unsplash.com/search?utf8=%E2%9C%93&keyword=life&button=', function(urls){getImages(urls)})); 

와 예입니다하지만 일을하거나 충분히 가까이해야합니다.

+0

왜 downvote? – ChandlerBing42

+0

이 코드에 약간의 예제가 있습니까? –

+0

자, 자. 나는 당신의 코드를 사용했습니다. 그러나 제발, 그냥 그것을 unsing하는 대신에 무엇을하는지 이해하려고 노력하십시오. 콜백/약속은 JS의 백본입니다. – ChandlerBing42

0

Bacause 요청 함수는 비동기 적으로 호출하므로 배열 채우기 전에 부모 함수 (getUrls, getImages)가 반환됩니다. 콜백을 사용해야합니다.

+0

약간의 예제를 제공 할 수 있습니까? 물론이 코드에서) –

관련 문제