我正在嘗試從 URL 下載 pdf 檔案并將它們保存到我的本地磁盤。問題是我需要一次下載一個檔案,中間有一個時間延遲(延遲應該是大約 1 秒)。也就是說:下載一個檔案后,腳本在下載下一個檔案之前應該等待一整秒)。
- 等待檔案被下載
- 等待檔案保存到磁盤
- 等待一整秒
- 重新開始那個回圈
代碼:
const fs = require('fs');
const fetch = require('node-fetch');
const arrayOfURL = ['www.link.com/file1', 'www.link.com/file2', 'www.link.com/file3'];
const wait = waitTime => new Promise(resolve => setTimeout(resolve, waitTime));
(async() => {
async function downloadAllFiles() {
return new Promise((resolve, reject) => {
(async() => {
for (let i = 0; i < arrayOfURL.length; i ) {
console.log(`File ${i} Download Begun`);
const response = await fetch(arrayOfURL[i]);
const writeStream = fs.createWriteStream(i '.pdf');
response.body.pipe(writeStream);
async function write() {
return new Promise((resolve, reject) => {
writeStream.on('finish', function () {
resolve('complete');
});
});
}
await write();
console.log(`----- DOWNLOAD COMPLETE -----`);
await wait(1000 * i);
if (i === 2) {
resolve('complete');
}
}
})();
});
}
await downloadAllFiles();
})();
我想要的日志是顯示這一點:
console.log(`File 0 Download Begun`);
console.log(`File Saved Locally`);
console.log(`----- DOWNLOAD COMPLETE -----`);
***Wait 1 second***
console.log(`File 1 Download Begun`);
console.log(`File Saved Locally`);
console.log(`----- DOWNLOAD COMPLETE -----`);
***Wait 1 second***
console.log(`File 2 Download Begun`);
console.log(`File Saved Locally`);
console.log(`----- DOWNLOAD COMPLETE -----`);
***Wait 1 second***
相反,日志顯示:
console.log(`File 0 Download Begun`);
console.log(`File 1 Download Begun`);
console.log(`File 2 Download Begun`);
console.log(`File Saved Locally`);
console.log(`----- DOWNLOAD COMPLETE -----`);
console.log(`File Saved Locally`);
console.log(`----- DOWNLOAD COMPLETE -----`);
console.log(`File Saved Locally`);
console.log(`----- DOWNLOAD COMPLETE -----`);
***Downloaded at the same time***
并且延遲也不起作用(所有檔案一次下載),因為iinawait wait(1000 * i)始終為 0;
任何幫助表示贊賞。
uj5u.com熱心網友回復:
該asyncIIFE是你的問題。IIFE 回傳一個你沒有做任何事情的承諾,因此for回圈只是繼續運行,因為沒有任何東西在等待 IIFE 回傳的承諾。
最好通過洗掉兩個 IIFE 并new Promise()完全像這樣洗掉包裝器來修復您的代碼:
const fs = require('fs');
const fetch = require('node-fetch');
const arrayOfURL = ['www.link.com/file1', 'www.link.com/file2', 'www.link.com/file3'];
const wait = waitTime => new Promise(resolve => setTimeout(resolve, waitTime));
async function downloadAllFiles() {
for (let i = 0; i < arrayOfURL.length; i ) {
console.log(`File ${i} Download Begun`);
const response = await fetch(arrayOfURL[i]);
const writeStream = fs.createWriteStream(i '.pdf');
response.body.pipe(writeStream);
async function write() {
return new Promise((resolve, reject) => {
writeStream.on('finish', function() {
resolve('complete');
});
writeStream.on('error', reject);
});
}
await write();
console.log(`----- DOWNLOAD COMPLETE -----`);
await wait(1000);
}
}
downloadAllFiles().then(() => {
console.log("done");
}).catch(err => {
console.log(err);
});
請注意,我還為writeStream.
當我替換一些真實的 URL 并在我的系統上運行它時,我得到了這個輸出并且在下載之間有一個明顯的暫停:
File 0 Download Begun
----- DOWNLOAD COMPLETE -----
File 1 Download Begun
----- DOWNLOAD COMPLETE -----
File 2 Download Begun
----- DOWNLOAD COMPLETE -----
done
asyncIIFE 很容易讓你陷入困境。他們回傳一個承諾(所有async函式都回傳一個承諾)所以如果你不注意那個承諾,那么在繼續你的代碼之前沒有人等待他們完成。我從不使用異步 IIFE,因為(對我而言)總是有一種更簡潔的方式來撰寫我的代碼。
另外,為什么要在回圈迭代之間暫停。感覺就像是試圖破解/修復一些不應該再存在或應該以更基本的方式修復的并發問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/398816.html
標籤:javascript 节点.js
