多次解析延迟Q.

时间:2016-09-09 19:28:05

标签: node.js q deferred

据我所知,deferred只能解析一次,并且nodejs在第一步缓存了所需的模块,以防止每次都加载它,但我想做的是每次想要解决时更新延迟的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返回者延迟承诺每次服务器获取/ api / posts地址,但问题是延迟对象仍然返回旧的解析值。

有一个解析值的抓取器功能,因此延迟无法在一个函数中进行本地化。

1 个答案:

答案 0 :(得分:2)

尝试在本地初始化deferred值以获得新的解析值。

 function returner() {
     var defer= $q.defer();
     return deferred.promise;
 };

 exports.returner = returner;