大佬教程收集整理的这篇文章主要介绍了Javascript背景循环,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我们有一个loop.js文件:
longLoop().then(res => console.log('loop result processing started'))
console.log('read file started')
require('fs').readFile(__filename,() => console.log('file processing started'))
setTimeout(() => console.log('timer fires'),500)
async function longLoop () {
console.log('loop started')
let res = 0
for (let i = 0; i < 1e7; i++) {
res += Math.sin(i) // arbitrary computation heavy operation
if (i % 1e5 === 0) await null /* solution: await new Promise(resolve => setImmediate(resolvE)) */
}
console.log('loop finished')
return res
}
如果run(node loop.js)输出:
loop started
read file started
loop finished
loop result processing started
timer fires
file processing started
当循环在后台运行时,如何重写此代码以读取和处理文件?
我的解决方案
我想出的是:
longLoop().then(res => console.log('loop result processing started'))
console.log('read file started')
require('fs').readFile(__filename,500)
async function longLoop () {
let res = 0
let from = 0
let step = 1e5
let numIterations = 1e7
function doIterations() {
//console.log(from)
return new Promise(resolve => {
setImmediate(() => { // or setTimeout
for (let i = from; (i < from + step) && (i < numIterations); i++) {
res += Math.sin(i)
}
resolve()
})
})
}
console.log('loop started')
while (from < numIterations) {
await doIterations()
from += step
}
console.log('loop finished')
return res
}
确实记录了:
loop started
read file started
file processing started
timer fires
loop finished
loop result processing started
有更简单,更简洁的方法吗?我的解决方案有什么缺点?
这是setTimeout的情况,也适用于readFile.它们的回调在任务队列中处于待处理状态,因此不会优先于等待生成的mircrotasks.
因此,您需要一种方法来等待将任务放入任务队列而不是微任务队列.这可以通过向它提供不会立即解决的承诺来实现,但只能在当前任务之后解析.
您可以使用…. setTimeout引入延迟:
const slowResolve = val => new Promise(resolve => setTimeout(resolve.bind(null,val),0));
您可以使用await调用该函数.这是一个使用图像加载而不是文件加载的片段,但原理是相同的:
const slowResolve = val => new Promise(resolve => setTimeout(resolve.bind(null,0));
longLoop().then(res =>
console.log('loop result processing started'))
console.log('read file started')
fs.onload = () =>
console.log('file processing started');
fs.src = "https://images.pexels.com/photos/34950/pexels-photo.jpg?h=350&auto=compress&cs=Tinysrgb";
setTimeout(() => console.log('timer fires'),500)
async function longLoop () {
console.log('loop started')
let res = 0
for (let i = 0; i < 1e7; i++) {
res += Math.sin(i) // arbitrary computation heavy operation
if (i % 1e5 === 0) await slowResolve(i);
}
console.log('loop finished')
return res
}
以上是大佬教程为你收集整理的Javascript背景循环全部内容,希望文章能够帮你解决Javascript背景循环所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。