如何为 Promise 解决添加延迟?向节点 http.request promise 添加延迟
How to add delay to a Promise resolve? Add delay to node http.request promise
尝试为 NodeJS 中的每个 http.request 添加一个小延迟,但当然节点总是进入同步模式。所以问题是如何在承诺履行后重置承诺的状态?
- 目前helper.delay()只工作一次开始然后所有的http请求都立即发送,导致服务器出错。
- 为什么我不能在 我的 module.exports 中对其他承诺使用 this.delay()?但它在正常的可导出函数中工作正常。
- 题外话。如何根据请求的 URL 将 http 切换为 https?
(不复制相同的代码,消除冗余)。
尝试在承诺中设置默认超时,用新的 setTimeout 承诺包装 http.request,尝试使用外部 "requestHandler" 作为回调,这是 运行 函数作为 thennable。 etc.etc
也许我必须 clearTimeout? https://nodejs.org/api/timers.html
出口
const wait = require("util").promisify(setTimeout);
module.exports = {
delay: async function(seconds){
await wait(seconds * 1000);
},
getUrl: function(url){
return new Promise((resolve, reject) => {
const options = new URL(url);
const resolver = http.request(options, res => {
res.setEncoding("utf8");
let responseBody = '';
res.on("data", body => {
responseBody += body
});
res.on('end', () => resolve(responseBody));
});
resolver.end();
});
}
};
应用程序
const helper = require("./exports.js");
async function getdata(url) {
const data = await help.getUrl(url);
let results = JSON.parse(data);
results = results.answer;
return results;
}
function fetchData(el, i) {
getdata(el).then(
answer => { console.log(answer)},
//...etc
)
}
function getLinksFromFile(file) {
helper.readFile(file)
.then(arr => {
arr.forEach((el, i) => {
/////////ISSUE HERE BELOW//////////////
helper.delay(4).then(() => {
////It only waits once
return fetchData(el, i);
});
});
});
}
getLinksFromFile("./links.txt");
objective 非常简单,读取 url 的表单文件,从 url 获取 json 数据并执行操作。 无依赖性
您需要阅读更多有关 Promise 工作原理的文章或对 Promises 进行更多实验,以更好地理解它们。
那么这段代码是做什么的:
arr.forEach((el, i) => {
/////////ISSUE HERE BELOW//////////////
helper.delay(4).then(() => {
////It only waits once
return fetchData(el, i);
});
});
您遍历 arr
的每个元素,并使用 helper.delay(4)
为每个元素创建延迟的 Promise。但是所有这些 Promise 都是在大致相同的时间创建的(相隔仅几纳秒),因为 forEach 不会等待一个 Promise 链完成。所以每个 fetchData
从 forEach
发生的时间延迟 4 秒。
解决该问题的最简单方法是将代码转换为使用 await
/async
语法:
async function getLinksFromFile(file) {
let arr = await helper.readFile(file);
for( let i=0, i<arr.length ; i++) {
let el = arr[i];
await helper.delay(4)
await fetchData(el, i)
}
}
在常规循环中使用 await
将在该点暂停循环,直到解决 Promise。
尝试为 NodeJS 中的每个 http.request 添加一个小延迟,但当然节点总是进入同步模式。所以问题是如何在承诺履行后重置承诺的状态?
- 目前helper.delay()只工作一次开始然后所有的http请求都立即发送,导致服务器出错。
- 为什么我不能在 我的 module.exports 中对其他承诺使用 this.delay()?但它在正常的可导出函数中工作正常。
- 题外话。如何根据请求的 URL 将 http 切换为 https? (不复制相同的代码,消除冗余)。
尝试在承诺中设置默认超时,用新的 setTimeout 承诺包装 http.request,尝试使用外部 "requestHandler" 作为回调,这是 运行 函数作为 thennable。 etc.etc 也许我必须 clearTimeout? https://nodejs.org/api/timers.html
出口
const wait = require("util").promisify(setTimeout);
module.exports = {
delay: async function(seconds){
await wait(seconds * 1000);
},
getUrl: function(url){
return new Promise((resolve, reject) => {
const options = new URL(url);
const resolver = http.request(options, res => {
res.setEncoding("utf8");
let responseBody = '';
res.on("data", body => {
responseBody += body
});
res.on('end', () => resolve(responseBody));
});
resolver.end();
});
}
};
应用程序
const helper = require("./exports.js");
async function getdata(url) {
const data = await help.getUrl(url);
let results = JSON.parse(data);
results = results.answer;
return results;
}
function fetchData(el, i) {
getdata(el).then(
answer => { console.log(answer)},
//...etc
)
}
function getLinksFromFile(file) {
helper.readFile(file)
.then(arr => {
arr.forEach((el, i) => {
/////////ISSUE HERE BELOW//////////////
helper.delay(4).then(() => {
////It only waits once
return fetchData(el, i);
});
});
});
}
getLinksFromFile("./links.txt");
objective 非常简单,读取 url 的表单文件,从 url 获取 json 数据并执行操作。 无依赖性
您需要阅读更多有关 Promise 工作原理的文章或对 Promises 进行更多实验,以更好地理解它们。
那么这段代码是做什么的:
arr.forEach((el, i) => {
/////////ISSUE HERE BELOW//////////////
helper.delay(4).then(() => {
////It only waits once
return fetchData(el, i);
});
});
您遍历 arr
的每个元素,并使用 helper.delay(4)
为每个元素创建延迟的 Promise。但是所有这些 Promise 都是在大致相同的时间创建的(相隔仅几纳秒),因为 forEach 不会等待一个 Promise 链完成。所以每个 fetchData
从 forEach
发生的时间延迟 4 秒。
解决该问题的最简单方法是将代码转换为使用 await
/async
语法:
async function getLinksFromFile(file) {
let arr = await helper.readFile(file);
for( let i=0, i<arr.length ; i++) {
let el = arr[i];
await helper.delay(4)
await fetchData(el, i)
}
}
在常规循环中使用 await
将在该点暂停循环,直到解决 Promise。