【发布时间】:2018-07-18 22:37:56
【问题描述】:
我正在尝试从网站下载文件,并希望使用 setTimeout 在每个请求之间暂停代码 1 秒。
我有一个 stockFile 函数,它循环遍历一组 url(path 是我在磁盘上存储文件的位置)。这是我的代码(版本 A):
async function stockFiles(urls, path) {
_.map(urls, async (elem) => {
await timeOut(1000);
const writableStream = await _createWriteStream(path);
await _getFile(elem, writableStream);
});
}
function timeOut(ms) {
return new Promise((fulfill) => {
setTimeout(fulfill, ms);
});
}
编辑:版本 B:
async function stockFiles(urls, path) {
_.map(urls, async (elem) => {
const writableStream = await _createWriteStream(path);
await _getFile(elem, writableStream);
await timeOut(1000);
});
}
function timeOut(ms) {
return new Promise((fulfill) => {
setTimeout(fulfill, ms);
});
}
问题:当我调用 stockFiles(版本 A)时,它会在发出请求之前暂停,但似乎我同时在磁盘上收到所有文件。我真正想要的是我的代码在每个请求之间暂停,因此每个文件接收之间存在延迟。
编辑:当我调用 stockFiles(版本 B)时,它根本不会暂停执行,并且我会同时收到所有文件。
/**************** helpers functions **************/
function _createWriteStream(path) {
return new Promise((fulfill, reject) => {
fs.createWriteStream(path, (err, data) => {
if (err) {
reject(err);
}
fulfill(data);
});
});
}
// I use superagent package to make the request
async function _getFile(url, writableStream) {
await request
.get(url)
.buffer(true).parse(request.parse.image)
.pipe(writableStream);
}
【问题讨论】:
-
要一次处理一个 Promise,请查看 npm 模块
p-each-series
标签: node.js asynchronous async-await settimeout es6-promise