Node.js 多次解析延迟Q
正如我所知,deferred只能解析一次,而且nodejs在第一步缓存所需的模块,以防止每次都加载它,但我想做的是在每次解析/拒绝返回值时更新deferred 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(
// 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()
,在编写时,它接受回调,但是否也返回承诺?