>웹 프론트엔드 >JS 튜토리얼 >JavaScript Promise를 순차적으로 해결하는 방법은 무엇입니까?

JavaScript Promise를 순차적으로 해결하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-13 17:49:15932검색

How to Resolve JavaScript Promises Sequentially?

​​​​​​​Promise를 순차적으로 해결

Promise는 JavaScript에서 비동기 작업을 처리하는 일반적인 방법입니다. 그러나 Promise가 해결되는 순서를 제어하는 ​​것은 어려울 수 있습니다.

문제:

일련의 파일을 순차적으로 읽는 다음 코드를 고려하세요.

var readFile = function(file) {
  ... // Returns a promise.
};

var readFiles = function(files) {
  return new Promise((resolve, reject) => {
    var readSequential = function(index) {
      if (index >= files.length) {
        resolve();
      } else {
        readFile(files[index]).then(function() {
          readSequential(index + 1);
        }).catch(reject);
      }
    };

    readSequential(0); // Start with the first file!
  });
};

이 코드는 재귀를 사용하여 파일을 하나씩 읽지만 작업이 어려울 수 있습니다. with.

Async/Await를 사용한 재귀 방지:

현대 JavaScript에서는 async 함수와 wait를 사용하는 것이 더 우아한 솔루션입니다.

async function readFiles(files) {
  for(const file of files) {
    await readFile(file);
  }
};

또는 다음을 사용하세요. 반복자:

비동기 생성기는 파일을 순차적으로 읽는 대체 접근 방식을 제공합니다.

async function* readFiles(files) {
  for(const file of files) {
    yield await readFile(file);
  }
};

간단한 루프를 고려하세요.

더 간단한 접근 방식을 선호하므로 기본 for 루프는 충분:

var readFiles = function(files) {
  var p = Promise.resolve(); // Q() in q

  files.forEach(file =>
      p = p.then(() => readFile(file)); 
  );
  return p;
};

또는 Promise Reduction 활용:

reduce를 사용하는 보다 컴팩트한 솔루션:

var readFiles = function(files) {
  return files.reduce((p, file) => {
     return p.then(() => readFile(file));
  }, Promise.resolve()); // initial
};

라이브러리 유틸리티 방법

특정 Promise 라이브러리 (예: Bluebird)는 이러한 목적에 맞는 유틸리티 메서드를 제공합니다.

var Promise = require("bluebird");
var fs = Promise.promisifyAll(require("fs"));

var readAll = Promise.resolve(files).map(fs.readFileAsync,{concurrency: 1 });
// if the order matters, you can use Promise.each instead and omit concurrency param

readAll.then(function(allFileContents){
    // do stuff to read files.
});

위 내용은 JavaScript Promise를 순차적으로 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.