Node.js 多次解析延迟Q

Node.js 多次解析延迟Q,node.js,q,deferred,Node.js,Q,Deferred,正如我所知,deferred只能解析一次,而且nodejs在第一步缓存所需的模块,以防止每次都加载它,但我想做的是在每次解析/拒绝返回值时更新deferred Q对象。 这是我的服务器代码: // server.js app.get('/api/posts', function(req,res,next){ var insta = require('./upRunner'); // this's the main obstacle insta.returner().then(

正如我所知,deferred只能解析一次,而且nodejs在第一步缓存所需的模块,以防止每次都加载它,但我想做的是在每次解析/拒绝返回值时更新deferred 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;
正如您所看到的,每次服务器获取/api/posts地址时,我几乎都会更新upRunner returner deferred promise,但问题是deferred对象仍然返回旧的解析值


有用于解析值的grabber函数,因此不能在单个函数中本地化defer。

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

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

 exports.returner = returner;

尝试在本地初始化
延迟
值以获取新的解析值

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

 exports.returner = returner;

还有一个函数使用“延迟”来解析值,因此无法在本地初始化。还有一个函数使用“延迟”来解析值,因此无法在本地初始化。如果不进一步了解延迟的创建位置和时间,我们将无法真正帮助您。简而言之,您需要从模块中公开一个方法,该方法在每次使用新的异步操作时创建一个新的延迟。我知道您已经说过,您不能只在
returner()
方法中创建一个新的deferred,但是如果确实是这样,那么您需要向我们展示创建deferred的原因和位置。如果希望每次调用新的异步操作时都基于承诺,则必须创建一个新的延迟/承诺。时期由您决定在哪里使用。@jfriend00我编辑了代码,我认为通过更改代码的结构和方法的功能可以解决问题,现在我应该在哪里使用承诺对您有意义吗?
requester()。然后()
通知我们
requester()
返回承诺,但是
request()
,在编写时它接受回调,但它是否也返回承诺呢?如果不进一步了解延迟的创建位置和时间,我们将无法真正帮助您。简而言之,您需要从模块中公开一个方法,该方法在每次使用新的异步操作时创建一个新的延迟。我知道您已经说过,您不能只在
returner()
方法中创建一个新的deferred,但是如果确实是这样,那么您需要向我们展示创建deferred的原因和位置。如果希望每次调用新的异步操作时都基于承诺,则必须创建一个新的延迟/承诺。时期由您决定在哪里使用。@jfriend00我编辑了代码,我认为通过更改代码的结构和方法的功能可以解决问题,现在我应该在哪里使用承诺对您有意义吗?
requester()。然后()
通知我们
requester()
返回承诺,但是,
request()
,在编写时,它接受回调,但是否也返回承诺?