繁体   English   中英

在继续之前等待节点完成从 https.get 响应写入文件?

[英]Wait for node to finish writing file from https.get response before continuing?

while 循环创建以太坊钱包,根据生成的地址下载 robohash 头像并将它们写入文件。 gLoops 设置创建的钱包数量。 在继续while循环之前,我需要执行等待头像文件下载并写入文件。 我认为它应该用 async/await 来完成,但我无法理解它

let gLoops = 0;
while (gLoops < 10) {

pKey = crypto.randomBytes(32).toString("hex");
wallet = new ethers.Wallet(pKey);
address = wallet.address;

let url = urlBase + address;

https.get(url, (response) => {
    let filePath = `${arg1path}\\avatars\\${address}.jpg`;
    let stream = fs.createWriteStream(filePath);

    response.pipe(stream);
    stream.on("finish", () => {
        stream.close();
        console.log("Download Completed");
    });
});

gLoops++;
}

尝试为您的函数使用异步等待功能?

您可以将https.get()包装在一个 promise 中,并使用await使for循环暂停以使其完成:

function processAvatar(pKey, wallet, address, url) {
    return new Promise((resolve, reject) => {
        https.get(url, (response) => {
            let filePath = `${arg1path}\\avatars\\${address}.jpg`;
            let stream = fs.createWriteStream(filePath);

            response.on("error", reject);

            stream.on("finish", () => {
                stream.close();
                console.log("Download Completed");
                resolve();
            }).on("error", reject);

            response.pipe(stream);

        }).on("error", reject);
    });
}


async function run() {
    for (let gLoops = 0; gLoops < 10; ++gLoops)
        let pKey = crypto.randomBytes(32).toString("hex");
        let wallet = new ethers.Wallet(pKey);
        let address = wallet.address;
        let url = urlBase + address;
        await processAvatar(pKey, wallet, address, url);
    }    
}

run().then(() => {
    console.log("all done");
}).catch(err => {
    console.log(err);
});

或者,您可以使用这里提到的 http 请求库之一,这些库已经是承诺感知的并直接使用它们。 该列表中我最喜欢的是got()库,它支持您使用它的方式的流。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM