지연된 모듈은 한 번만 해결할 수 있으며 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 주소이지만 문제는 지연된 객체가 여전히 이전 해결 된 값을 반환한다는 것입니다.
값을 분석하는 그래버 기능이 있으므로 지연 기능을 단일 기능으로 현지화 할 수 없습니다.
지연이 생성되는 시점과시기에 대해 자세히 이해하지 않으면 도움이되지 않습니다. 요컨대, 새로운 비동기 작업을 사용할 때마다 새로운 지연을 생성하는 모듈의 메소드를 노출해야합니다. 나는 당신이'returner()'메소드에서 새로운 것을 연기 할 수는 없다는 것을 주석으로 알았지 만, 이것이 사실이라면, 왜 그리고 왜 지연이 생성 될 수 있는지 우리에게 보여줄 필요가있다. 새로운 비동기 작업을 호출 할 때마다 약속 기반으로 만들려면 새로운 지연/약속을 만들어야합니다. 기간. 어디서 왔는지는 당신에게 달려 있습니다. – jfriend00
@ jfriend00 나는 코드를 편집했다. 문제는 코드의 구조와 메서드의 기능을 변경하여 해결할 수 있다고 생각한다. 약속을 사용해야하는 곳에서 이제는 의미가있는 것인가? – user3078441
'requester(). then()'은'requester()'가 약속을 되 돌렸지 만,'request()'는 어떨까요? 쓰여진대로 콜백을 받아들이지 만 약속을 되풀이합니까? –