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 중국어 웹사이트의 기타 관련 기사를 참조하세요!