我首先有两个函数,在那个循环中有一个for循环,我在调用第二个具有请求承诺的函数。我担心的是,当循环正在执行并调用第二个函数时,它不等待请求承诺完成,因此循环将在下一个迭代并再次调用第二个函数。 我希望先完成请求,然后再下一次循环。那我该怎么办呢?为了简单起见,我粘贴第一个和第二个功能的代码段
第一个功能代码段
for (let i = 0; i < len; ++i) {
var url_ = "https://www.someurl****.com" + allUrls_ + urlLastParam + (i + 1).toString();
console.log(allUrls_);
console.log('getValues URL: ' + url_);
getValues(res, url_, allUrls_)
}
第二功能
const rp = require('request-promise');
const cheerio = require('cheerio');
function getValues(res, url_, allUrls_) {
let options = {
uri: url_,
transform: function (body) {
return cheerio.load(body);
}
};
console.log('inside getValues');
rp(options)
.then(function ($) {
console.log('inside getValues function request');
$('.some-selector').map(function (i, links) {
// my custom code
})
})
.catch(function (err) {
// catch errors
})
}
答案 0 :(得分:1)
如果您从getValues()
返回承诺,则可以在async/await
循环中将for
与承诺一起使用,以暂停getValues()
的每次调用并对其进行排序成为一个接一个,而不是同时运行:
const rp = require('request-promise');
const cheerio = require('cheerio');
function getValues(res, url_, allUrls_) {
let options = {
uri: url_,
transform: function (body) {
return cheerio.load(body);
}
};
console.log('inside getValues');
return rp(options).then(function($) { // return promise here
console.log('inside getValues function request');
cheerio在这里 $('。some-selector')。map(function(i,links){ //我的自定义代码 }) 退货//大概在这里返回一些东西 }); }
async function process() {
try {
for (let i = 0; i < len; ++i) {
var url_ = "https://www.someurl****.com" + allUrls_ + urlLastParam + (i + 1).toString();
console.log(allUrls_);
console.log('getValues URL: ' + url_);
let value = await getValues(res, url_, allUrls_); // await here
} catch(e) {
console.log(e);
// handle any error that occurred in getValues()
}
}
}
仅供参考,$('.some-selector')
不能像您在这段代码中那样工作。 $
是您的HTML。您必须先将html内容加载到cheerio中,然后才能执行此操作(我已将其添加到我的答案中)。