【发布时间】: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?