async 함수
1. async 구문
2. 사용법
함수가 실행될 때, await를 만나면 먼저 되돌아오고, 비동기적인 조작이 완성될 때까지 기다린 다음에 함수 체내 뒤의 문장을 실행한다.50ms 이후 Hello World 출력 function timeout(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value);
}
asyncPrint('hello world', 50);
3. 문법
function timeout(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value);
}
asyncPrint('hello world', 50);
4. 주의점
//
let [foo, bar] = await Promise.all([getFoo(), getBar()]);
//
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;
5. 비동기식 운영 순서
URL 세트를 원격으로 읽은 다음 읽는 순서대로 결과를 출력합니다.promise 방식function logInOrder(urls) {
// URL
const textPromises = urls.map(url => {
return fetch(url).then(response => response.text());
});
// reduce promise
textPromises.reduce((chain, textPromise) => {
return chain.then(() => textPromise)
.then(text => console.log(text));
}, Promise.resolve());
}
async 병행 실현 async function logInOrder(urls) {
// URL
const textPromises = urls.map(async url => {
const response = await fetch(url);
return response.text();
});
//
for (const textPromise of textPromises) {
console.log(await textPromise);
}
}
총괄:array.map(callback) 동시 실행
6. 비동기 트랙터
문제:iterator 플러그인에서,next 방법은 동기화되어야 하며, 호출하기만 하면 즉시 값을 되돌려야 합니다.즉,next 방법을 실행하면value와done 두 속성을 동기화해야 한다는 것이다.만약 지침이 동기화 조작을 가리키고 있다면 당연히 문제가 없지만 비동기화 조작에 대해서는 그다지 적합하지 않다.비동기 반복기
function logInOrder(urls) {
// URL
const textPromises = urls.map(url => {
return fetch(url).then(response => response.text());
});
// reduce promise
textPromises.reduce((chain, textPromise) => {
return chain.then(() => textPromise)
.then(text => console.log(text));
}, Promise.resolve());
}
async function logInOrder(urls) {
// URL
const textPromises = urls.map(async url => {
const response = await fetch(url);
return response.text();
});
//
for (const textPromise of textPromises) {
console.log(await textPromise);
}
}
문제:iterator 플러그인에서,next 방법은 동기화되어야 하며, 호출하기만 하면 즉시 값을 되돌려야 합니다.즉,next 방법을 실행하면value와done 두 속성을 동기화해야 한다는 것이다.만약 지침이 동기화 조작을 가리키고 있다면 당연히 문제가 없지만 비동기화 조작에 대해서는 그다지 적합하지 않다.비동기 반복기
asyncIterator
.next()
.then(
({ value, done }) => /* ... */
);
비동기 트랙터가 사실 두 번의 값을 되돌려 주었다.처음 호출할 때 Promise 대상을 되돌려줍니다.Promise 대상이 Resolve가 되면 현재 데이터 구성원 정보를 표시하는 대상을 되돌려줍니다.이것은 비동기 트랙터와 동기 트랙터의 최종 행위는 일치하지만 먼저 Promise 대상으로 돌아가 중개로 삼을 뿐이라는 것이다.
비동기 플러그인의next 방법은 연속적으로 호출할 수 있으며, 이전에 생성된 Promise 대상resolve 이후에 호출할 필요가 없습니다.이런 상황에서next 방법은 누적되어 자동적으로 한 걸음 한 걸음 순서대로 운행된다.
const asyncGenObj = createAsyncIterable(['a', 'b']);
const [{value: v1}, {value: v2}] = await Promise.all([
asyncGenObj.next(), asyncGenObj.next()
]);
console.log(v1, v2); // a b
const writer = openFile('someFile.txt');
writer.next('hello');
writer.next('world');
await writer.return();
7. 비동기적인iterator 인터페이스 for await-of
let body = '';
async function f() {
for await(const data of req) body += data;
const parsed = JSON.parse(body);
console.log('got', parsed);
}
8. 비동기식 Generator 함수
비동기식 Generator 함수는 async 함수와 Generator 함수의 결합 예 1: async function* gen() {
yield 'hello';
}
const genObj = gen();
genObj.next().then(x => console.log(x));
// { value: 'hello', done: false }
예2: async function* readLines(path) {
let file = await fileOpen(path);
try {
while (!file.EOF) {
yield await file.readLine();
}
} finally {
await file.close();
}
}
await 명령은 외부 조작으로 인한 값을 함수 내부에 입력하는 데 사용되며, yield 명령은 함수 내부의 값을 yield로 출력한 후 비동기 트랙터를 연결하는 데 사용됩니다 * async function* gen1() {
yield 'a';
yield 'b';
return 2;
}
async function* gen2() {
// result 2
const result = yield* gen1();
}
for await-of 순환을 사용하면gen1의 yield가 펼쳐집니다 (async function () {
for await (const x of gen2()) {
console.log(x);
}
})();
// a
// b
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
async function* gen() {
yield 'hello';
}
const genObj = gen();
genObj.next().then(x => console.log(x));
// { value: 'hello', done: false }
async function* readLines(path) {
let file = await fileOpen(path);
try {
while (!file.EOF) {
yield await file.readLine();
}
} finally {
await file.close();
}
}
async function* gen1() {
yield 'a';
yield 'b';
return 2;
}
async function* gen2() {
// result 2
const result = yield* gen1();
}
(async function () {
for await (const x of gen2()) {
console.log(x);
}
})();
// a
// b
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.