【问题标题】:Resolving a deferred Q multiple times多次解析延迟的 Q
【发布时间】:2023-03-16 08:56:01
【问题描述】:

据我所知,deferred 只能解决一次,并且 nodejs 在第一步缓存所需的模块以防止每次都加载它,但我想要做的是每次我想要解决时更新延迟的 Q 对象/reject 一个返回值。 这是我的服务器代码:

// 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。我知道您已经评论说您不能只在 returner() 方法中创建新的 deferred,但如果确实如此,那么您需要向我们展示为什么以及在哪里可以创建 deferred。如果您希望新的异步操作在每次调用时都基于 Promise,则必须创建一个新的 deferred/Promise。时期。由您决定在哪里。
  • @jfriend00 我编辑了代码,我认为可以通过改变我的代码结构和方法的功能来解决这个问题,现在我应该在哪里使用承诺对你有意义吗?
  • requester().then() 告诉我们requester() 返回了一个promise,但是request() 怎么样,它接受回调但它也返回一个promise?

标签: node.js q deferred


【解决方案1】:

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

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

 exports.returner = returner;

【讨论】:

  • 还有一个函数使用 defer 来解析值,所以不能在本地初始化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 2013-09-27
相关资源
最近更新 更多