2016-09-09 12 views
0

지연된 모듈은 한 번만 해결할 수 있으며 nodejs는 매번 모듈을로드하지 못하도록하기 위해 첫 번째 단계에서 필요한 모듈을 캐시하지만 지연된 Q 객체를 갱신하고 싶습니다. 반환 값을 해결하거나 거부하려고 할 때마다 이 내 서버 코드 :지연된 Q를 여러 번 해결하기

// server.js 

app.get('/api/posts', function(req,res,next){ 
    var insta = require('./upRunner'); // this's the main obstacle 
    insta.returner().then(function(data){ 
    // .... 
    }; 
}); 

및 ./upRunner.js에 대한 코드 것은 :

// upRunner.js 
... 
var defer = Q.defer(); 
upRunner(); 

    function extractor(body) { 
    var $ = cheerio.load(body), scripts= []; 
    $('script').each(function(i, elem){ 
     scripts[i] = $(this).text(); 
    }); 
    var str = scripts[6], 
    newData = JSON.parse(str.substring(str.indexOf("{"), str.lastIndexOf(";"))).entry_data.TagPage[0].tag.media.page_info; 
    grabber(str); 
    return newData; 
} 
function grabber(str) { 
newData = JSON.parse(str.substring(str.indexOf("{"), str.lastIndexOf(";"))).entry_data.TagPage[0].tag.top_posts.nodes; 
newData.sort(dynamicSort('-date')); 
newData.forEach(function(elem,index,array){ 
    if (instaImages.length >= 10) { 
     defer.resolve(instaImages); 
    } else {    
     instaImages.push(elem); 
    } 
}); 
} 

function upRunner(newData){ 

profilePage = !(tagPage = URL.includes("/tags/") ? true : false); 
if (!newData) { 
    request(URL,{jar:true}, function(err, resp, body){ 
    var $ = cheerio.load(body), scripts= []; 
    $('script').each(function(i, elem){ 
     scripts[i] = $(this).text(); 
    }); 
    var str = scripts[6], 
    newData = JSON.parse(str.substring(str.indexOf("{"), str.lastIndexOf(";"))).entry_data.TagPage[0].tag.media.page_info; 
    upRunner(newData); 
}); 
} else { 
    if (newData.has_next_page) { 
     requester(URL, newData.end_cursor).then(function(body){ 
      newData = extractor(body); 
      upRunner(newData); 
     }); 
    } else { 
     console.log('it\'s finished\n'); 
    } 

function returner() { 
    return deferred.promise; 
} 
exports.returner = returner; 

당신은 내가 거의 upRunner의 기 returner 때마다 서버가 얻을 연기 약속을 갱신하고있어시피/API/posts 주소이지만 문제는 지연된 객체가 여전히 이전 해결 된 값을 반환한다는 것입니다.

값을 분석하는 그래버 기능이 있으므로 지연 기능을 단일 기능으로 현지화 할 수 없습니다.

+0

지연이 생성되는 시점과시기에 대해 자세히 이해하지 않으면 도움이되지 않습니다. 요컨대, 새로운 비동기 작업을 사용할 때마다 새로운 지연을 생성하는 모듈의 메소드를 노출해야합니다. 나는 당신이'returner()'메소드에서 새로운 것을 연기 할 수는 없다는 것을 주석으로 알았지 만, 이것이 사실이라면, 왜 그리고 왜 지연이 생성 될 수 있는지 우리에게 보여줄 필요가있다. 새로운 비동기 작업을 호출 할 때마다 약속 기반으로 만들려면 새로운 지연/약속을 만들어야합니다. 기간. 어디서 왔는지는 당신에게 달려 있습니다. – jfriend00

+0

@ jfriend00 나는 코드를 편집했다. 문제는 코드의 구조와 메서드의 기능을 변경하여 해결할 수 있다고 생각한다. 약속을 사용해야하는 곳에서 이제는 의미가있는 것인가? – user3078441

+0

'requester(). then()'은'requester()'가 약속을 되 돌렸지 만,'request()'는 어떨까요? 쓰여진대로 콜백을 받아들이지 만 약속을 되풀이합니까? –

답변

2

deferred 값을 로컬로 초기화하여 새로운 해결 값을 얻으려고합니다.

+0

값을 해결하기 위해 defer를 사용하는 다른 함수가 있으므로 로컬로 초기화 할 수 없습니다. – user3078441