async.progress怎么让他的值为1
时间: 2024-03-05 13:47:23 浏览: 20
`async.progress` 是一个 Promise 对象的属性,表示异步操作的进度,它的值范围是从 0 到 1。要让它的值为 1,需要满足以下几个条件:
1. 异步操作必须已经完成。
2. 异步操作必须返回一个 Promise 对象,且该 Promise 对象的状态已经变为 `fulfilled`。
3. 如果 Promise 对象的状态已经变为 `fulfilled`,则 `async.progress` 的值为 1。
以下是一个示例代码,可以让 `async.progress` 的值为 1:
```
const asyncFunc = async () => {
// 异步操作
};
const promise = asyncFunc();
promise.then(() => {
async.progress = 1;
});
```
在这个例子中,`asyncFunc` 是一个异步函数,返回一个 Promise 对象。当 Promise 对象的状态变为 `fulfilled` 时,我们将 `async.progress` 的值设置为 1。
相关问题
import { Sha256 } from '@aws-crypto/sha256-js' // 导入SHA256算法 import SparkMD5 from 'spark-md5' // 导入MD5算法 onmessage = async function (event) { const data = event.data // 获取文件数据 // chunk方式读取文件 const chunkSize = 1024 * 1024 // 每次读取1MB const fileSize = data.size // 文件大小 let offset = 0 // 偏移量 const hash = new Sha256() // 创建SHA256实例 const spark = new SparkMD5.ArrayBuffer() // 创建MD5实例 while (offset < fileSize) { const chunk = new Blob([data], { type: data.type }).slice(offset, offset + chunkSize) // 读取文件块 const buffer = await chunk.arrayBuffer() // 将文件块转为ArrayBuffer hash.update(buffer) // 更新文件的SHA256值 spark.append(buffer) // 更新文件的MD5值 offset += chunkSize // 更新偏移量 // 计算进度 const progress = Math.min(100, Math.round((offset / fileSize) * 100)) console.log(progress + '%') // 打印进度 } // 计算SHA256值和MD5值 const [ sha256Uint8Array32, // SHA256 Unit8Array(32) md5, // MD5 ] = await Promise.all([ hash.digest(), // 计算SHA256值 spark.end(), // 计算MD5值 ]) let obj = { md5, // MD5 sha256Int8Array32: Array.from(new Int8Array(sha256Uint8Array32)), // SHA256 Int8Array(32) } console.log(obj) // 打印结果对象 postMessage(obj) // 将结果对象发送给主线程 } 优化这段代码让我拿到文件的sha256值
这段代码的计算SHA256值的部分已经是使用AWS SDK提供的SHA256算法库,是比较高效和准确的,没有太多可以优化的地方。不过,可以进行以下两点优化:
1. 将每次更新SHA256值的数据从ArrayBuffer改为Uint8Array类型,因为Uint8Array比ArrayBuffer更适合用于进行二进制数据的处理和传输,可以减少类型转换的开销。
2. 每次读取文件块时,只需要获取该块的Uint8Array数据,而不需要再用Blob类型进行封装,这样可以减少一次类型转换的开销。
优化后的代码如下所示:
```
import { Sha256 } from '@aws-crypto/sha256-js'; // 导入SHA256算法
import SparkMD5 from 'spark-md5'; // 导入MD5算法
onmessage = async function (event) {
const data = event.data; // 获取文件数据
// chunk方式读取文件
const chunkSize = 1024 * 1024; // 每次读取1MB
const fileSize = data.size; // 文件大小
let offset = 0; // 偏移量
const hash = new Sha256(); // 创建SHA256实例
const spark = new SparkMD5.ArrayBuffer(); // 创建MD5实例
while (offset < fileSize) {
const chunk = new Uint8Array(await data.slice(offset, offset + chunkSize).arrayBuffer()); // 读取文件块
hash.update(chunk); // 更新文件的SHA256值
spark.append(chunk); // 更新文件的MD5值
offset += chunkSize; // 更新偏移量
// 计算进度
const progress = Math.min(100, Math.round((offset / fileSize) * 100));
console.log(progress + '%'); // 打印进度
}
// 计算SHA256值和MD5值
const [ sha256Uint8Array32, md5 ] = await Promise.all([
hash.digest(), // 计算SHA256值
spark.end() // 计算MD5值
]);
const obj = {
md5, // MD5
sha256Int8Array32: Array.from(new Int8Array(sha256Uint8Array32)) // SHA256 Int8Array(32)
};
console.log(obj); // 打印结果对象
postMessage(obj); // 将结果对象发送给主线程
}
```
import { Sha256 } from '@aws-crypto/sha256-js' import CryptoJs from 'crypto-js' import encHex from 'crypto-js/enc-hex' onmessage = async function (event) { const data = event.data // 获取文件数据 // chunk方式读取文件 const chunkSize = 1024 * 1024 // 每次读取1MB const fileSize = data.size // 文件大小 let offset = 0 // 偏移量 const createSha256Uint8Array32 = new Sha256() // SHA256 Unit8Array(32) const createSha1 = CryptoJs.algo.SHA1.create() // SHA1 Hex const createSha256 = CryptoJs.algo.SHA256.create() // SHA256 Hex const createSha512 = CryptoJs.algo.SHA512.create() // SHA512 Hex const createMD5 = CryptoJs.algo.MD5.create() // MD5 while (offset < fileSize) { const chunk = new Uint8Array(await data.slice(offset, offset + chunkSize).arrayBuffer()) // 读取chunkSize大小的文件块 const wordArray = CryptoJs.lib.WordArray.create(chunk) createSha256Uint8Array32.update(chunk) createSha1.update(wordArray) createSha256.update(wordArray) createSha512.update(wordArray) createMD5.update(wordArray) offset += chunkSize // 计算进度 // const progress = Math.min(100, Math.round((offset / fileSize) * 100)) // console.log(progress) // 打印进度 // postMessage({ progress, offset, fileSize, }) // 将进度发送给主线程 } const [sha256Uint8Array32, sha1, sha256, sha512, md5] = await Promise.all([ createSha256Uint8Array32.digest(), // SHA256 Unit8Array(32) encHex.stringify(createSha1.finalize()), // SHA1 Hex encHex.stringify(createSha256.finalize()), // SHA256 Hex encHex.stringify(createSha512.finalize()), // SHA512 Hex encHex.stringify(createMD5.finalize()), // MD5 ]) const obj = { md5, // MD5 sha1, // SHA1 Hex sha256, // SHA256 Hex sha512, // SHA512 Hex sha256Int8Array32: Array.from(new Int8Array(sha256Uint8Array32)), // SHA256 Int8Array(32) } console.log(obj) // 打印结果对象 postMessage(obj) // 将结果对象发送给主线程 } 加功能计算文件 crc32
你的代码中已经计算了文件的 MD5、SHA1、SHA256 和 SHA512 值,并且将结果存储在了一个对象中。如果你要计算文件的 CRC32 值,可以使用一些第三方库来实现。
以下是一个使用 `crc32` 库计算文件 CRC32 值的示例代码:
```javascript
import { Sha256 } from '@aws-crypto/sha256-js'
import CryptoJs from 'crypto-js'
import encHex from 'crypto-js/enc-hex'
import crc32 from 'crc32'
onmessage = async function (event) {
const data = event.data // 获取文件数据
// chunk方式读取文件
const chunkSize = 1024 * 1024 // 每次读取1MB
const fileSize = data.size // 文件大小
let offset = 0 // 偏移量
const createSha256Uint8Array32 = new Sha256() // SHA256 Unit8Array(32)
const createSha1 = CryptoJs.algo.SHA1.create() // SHA1 Hex
const createSha256 = CryptoJs.algo.SHA256.create() // SHA256 Hex
const createSha512 = CryptoJs.algo.SHA512.create() // SHA512 Hex
const createMD5 = CryptoJs.algo.MD5.create() // MD5
let crc = 0 // CRC32 值
while (offset < fileSize) {
const chunk = new Uint8Array(await data.slice(offset, offset + chunkSize).arrayBuffer()) // 读取chunkSize大小的文件块
const wordArray = CryptoJs.lib.WordArray.create(chunk)
createSha256Uint8Array32.update(chunk)
createSha1.update(wordArray)
createSha256.update(wordArray)
createSha512.update(wordArray)
createMD5.update(wordArray)
crc = crc32(chunk, crc) // 计算 CRC32 值
offset += chunkSize
// 计算进度
// const progress = Math.min(100, Math.round((offset / fileSize) * 100))
// console.log(progress) // 打印进度
// postMessage({ progress, offset, fileSize, }) // 将进度发送给主线程
}
const [sha256Uint8Array32, sha1, sha256, sha512, md5] = await Promise.all([
createSha256Uint8Array32.digest(), // SHA256 Unit8Array(32)
encHex.stringify(createSha1.finalize()), // SHA1 Hex
encHex.stringify(createSha256.finalize()), // SHA256 Hex
encHex.stringify(createSha512.finalize()), // SHA512 Hex
encHex.stringify(createMD5.finalize()), // MD5
])
const obj = {
md5, // MD5
sha1, // SHA1 Hex
sha256, // SHA256 Hex
sha512, // SHA512 Hex
sha256Int8Array32: Array.from(new Int8Array(sha256Uint8Array32)), // SHA256 Int8Array(32)
crc32: crc.toString(16), // CRC32 值
}
console.log(obj) // 打印结果对象
postMessage(obj) // 将结果对象发送给主线程
}
```
在上面的代码中,我们引入了 `crc32` 库,并在每次读取文件块时调用 `crc32` 函数计算 CRC32 值。计算完成后,将 CRC32 值添加到结果对象中,并通过 `postMessage` 函数将结果对象发送给主线程。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)