js 异步情况下如何保证数组操作的正确性?

有一个数组 A
js中异步执行加载多个外部文件操作,比如加载文件a、b...n

for(...){
  异步加载();
  A.push(0);
}

加载成功一个文件后

A.pop()

最后判断A的长度,如果为0,则说明加载完毕。

请问,如何保证同一时间对A的操作只有一个呢?

阅读 2.3k
2 个回答

负责执行JavaScript代码的线程只有一个,你用js写的所有代码都会在一个线程里执行,所以不需要考虑同步问题。另外你的用于判断文件是否全部加载完毕的操作应该是用一个数字变量记录已加载的文件数或待加载的文件数,往数组里塞没用的东西再判断长度完全没有必要,而且放的位置也不对(要放在回调函数里)。例如

let filesToLoad = files.length
for(let file of files) {
  load(file, err => {
    if(err) return console.error(err)
    filesToLoad--
    if(filesToLoad == 0) console.log('All files loaded')
  })
}

另外可以使用PromisePromise.all加上await,看起来会舒服点。

const { promisify } = require('util')
const readFile = promisify(require('fs').readFile)

// const files = [ ... ]

async function loadFiles(files) {
  const _files = await Promise.all(files.map(async file => await readFile(file)))
  // All files are now loaded
  // Do something to loaded content
  console.log(_files)
}

// Call loadFiles somewhere

通过添加一个promise,在判断返回0时,执行resolve()这样就可以在完成后,再调用第二个文件

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题