νμ¬ λμμ λ§€μ° λλμ΅λλ€.
await async.parallel({foo: async()=>Promise.all([1,2])})
// { foo: [ 1, 2 ] }
await async.parallel({foo: ()=>Promise.all([1,2])})
// waits forever because non-async function expects a ballback
짧μ ν¨μμ κ²½μ° foo: () => doSomething()
μμ±νκ³ μΆμ μ μμ΅λλ€. async
ν€μλλ₯Ό μμ΄λ²λ¦¬κΈ°κ° λ§€μ° μ½μ΅λλ€.
κ·Έλ¬λ νμ¬ μ΄κ²μ μλνμ§ μμ΅λλ€. foo: async () => doSomething()
λ‘ μμ±ν΄μΌ ν©λλ€.
ν¨μκ° AsyncFunctionμΈμ§ νμΈνλ λμ μ½λ°±μ΄ μ λ¬λμλμ§ νμΈν μ μμ΅λκΉ?
ν¨μκ° μ½μμ λ°ννλμ§ μ¬λΆμ μ½λ°±μ 미리 μ λ¬ν΄μΌ νλμ§ μ¬λΆλ₯Ό μμ μ μΌλ‘ κ°μ§ν μ μλ λ°©λ²μ΄ μμ΅λλ€. ( Function.length
λλ Function.toString()
ꡬ문 λΆμμΌλ‘λ μΆ©λΆνμ§ μμ΅λλ€.) μ΄κ²μ΄ asyncify
μ κ΄ν κ²μ
λλ€. μ½μμ λ°ννλ ν¨μλ₯Ό μ½λ°±μ λ°λ ν¨μλ‘ λ³ννλ κ²μ
λλ€. async
ν¨μλ μ νμ΄ λ€λ₯΄κΈ° λλ¬Έμ κ°μ§ν μ μμΌλ―λ‘ μλμΌλ‘ asyncify
ν μ μμ΅λλ€(μ΄κ²μ΄ λ΄λΆμ μΌλ‘ μλνλ λ°©μμ
λλ€). κ·Έλ¬λ μ½μμ λ°ννλ μΌλ° ν¨μμ κ²½μ° Asyncκ° νΈμΆνκΈ° μ μ μ μ μλ λ°©λ²μ΄ μμ΅λλ€.
@aearly ν , κ·Έλμ μλ§λ μ΅μμ μμ€μμ μ½λ°±μ κ°μ§νλ κ²κ³Ό κ°μ λ κ°λ¨ν κ²μ΄ μμκΉμ?
async function parallel(o, cb) {
if (!cb) { // promise behavior
return Object.fromEntries(
await Promise.all(Object.entries(o).map(async ([k, v]) => [k, await v()]))
)
}
// else do the callback behavior
}
μ°λ¦¬λ μ΄λ―Έ κ·Έλ° μμ
λλ€. async.parallel
λν μ½λ°±μ μλ΅νλ©΄ μ½μμ λ°νν©λλ€. μ¬μ©μ μλλ₯Ό κ°μ ν λ°©λ²μ΄ μκΈ° λλ¬Έμ μ½λ°±μ μλ΅νλ©΄ μ λ¬ν ν¨μκ° μ½μμ λ°ννλ€κ³ κ°μ νμ§ μμ΅λλ€. λ΄κ° λ¬΄μ¨ λ§μΈμ§ μ€ν΄νκ³ μλ 건 μλκΉ?
μ’μ, ꡬ체μ μΌλ‘ λ§ν΄ 보μ: https://repl.it/@caub/async -async
// npm.im/async expects all inner functions to be async,
// even when using no outer callback (as 2nd arg of async.parallel)
console.log(
await async.parallel({
foo: async () => delay(1000).then(() => 1),
bar: async (rs) => {
return 2
},
})
);
// Doesn't work without those async,
// but I'd like this to resolve just like above instead of freezing
console.log(
await async.parallel({
foo: () => delay(1000).then(() => 1),
bar: () => {
return 2
},
})
);
λ€μ μ£Όμ λ²μ μμλ λ€μκ³Ό μ μ¬ν λ°©μμΌλ‘λ§ μ½λ°±μ μ§μνλ κ²μ΄ ν₯λ―Έλ‘μΈ μ μλ€κ³ μκ°ν©λλ€.
await Promise.all([
{ then(resolve){ setTimeout(resolve, 50, 1) } }, // callback way
2,
delay(45).then(())=>3)
])
// [1, 2, 3]
λ΄λΆ ν¨μμμ λΆνμν async
ν€μλμ νμμ± μ κ±°
μ₯μ μ λ λͺ
νν©λλ€. μ¬μ©μ μλλ₯Ό κ°μ νμ§ μλ κ²μ λν κ·νμ μμ μ μ΄ν΄νμ§λ§ μ¬μ ν μ¬λλ€μ΄ Promise ν΄κ²°μ μ¬μ©νλ €κ³ ν λ async
ν€μλλ₯Ό μμ§ μμ κ²μ΄λΌκ³ κ°μ νκ³ μμ΅λλ€.
κ·Έκ²μ κ½€ ν° λ°©μμΌλ‘ μ΄μ λ²μ κ³Όμ νΈνμ±μ κΉ¨λ¨λ¦΄ κ²μ
λλ€. μλ₯Ό λ€μ΄ Async.map(fileNames, fs.readFile)
μ κ°μ μΌμ λ μ΄μ ν μ μμ΅λλ€.
μ΄λμ λΆλ¬μ§λμ§ μ€λͺ ν΄μ£Όμ€ μ μλμ?
νμ¬ μ€λ¨λ λ΄μ©μ λ€μκ³Ό κ°μ΅λλ€.
await async.map(['server.js', 'package.json'], fs.readFile) // works
await async.map(['server.js', 'package.json'], fs.promises.readFile) // works
await async.map(['server.js', 'package.json'], s => fs.promises.readFile(s)) // doesn't work
await async.map(['server.js', 'package.json'], async s => fs.promises.readFile(s)) // works
μμ΄λμ΄λ μΈ λ²μ§Έ λ¬Έμ λ₯Ό ν΄κ²°νλ κ²μ λλ€.
μλ₯Ό λ€μ΄ λ€μκ³Ό κ°μ΄ μΌμ΅λλ€.
// ...
doc = await async.map(items, item => item.toDoc(currentUser, options));
μ΄λκ°μ, κ·Έλ¦¬κ³ async item => item.toDoc..
μμ΄λ²λ ΈκΈ° λλ¬Έμ μκ°μ΄ μ΄κ³Όλμμ΅λλ€.
κ·Έ κ²½μ°μ λ νΌμλΌλ©΄ κ°μΉκ° μμ§λ§ λ λ§μ μ¬λλ€μ΄μ΄ μν©μ μλ€λ©΄ μ μ λ λ³κ²½ μ¬νμ κ³ λ €ν κ°μΉκ° μλ€κ³ μκ°ν©λλ€
async.map
κ° μλ μ΄ μλ λ§€μ° λνμ μΈ μμ
λλ€.
doc = await Promise.all(items.map(item => item.toDoc(currentUser, options)));
async item => item.toDoc..
νμ μμ΄ μλ
μΈ λ²μ§Έ λ¬Έμ λ₯Ό μμ μ μΌλ‘ κ³ μΉ μ μλ λ°©λ²μ μμ΅λλ€. μ΄κ²μ κ³Όκ±°μ λ§μ΄ λ
Όμλμμ΅λλ€. ν¨μμ λ°ν κ°μ νμΈν λ€μ μκΈνμ¬ ν¨μμ μ½λ°±μ μ λ¬νμ§ μμ μ μμ΅λλ€. async
ν€μλλ κ·Έλ§νΌ μ’μ΅λλ€.
@caub λ»λ»ν νλ¬κ·Έκ° μ¬κΈ°μ μμ§λ§ asyncp
μλ μ¬κΈ°μμ μ°Ύκ³ μλ κ²μ μ²λ¦¬ν μ μλ λ₯λ ₯μ΄ μλ€κ³ μκ°ν©λλ€.
μ΄ λ¬Έμ κ° μ’
λ£λ μνμμλ μμ λ§ν¬λ λ¬Έμ μ κ°μ΄ μ¬κΈ°μ @caub λ¬Έμ λ€μ κ°μ‘°νκ³ μΆμ΅λλ€.
νμ¬μ νλμ λλ₯Ό λ§μ΄ νΌλμ€λ½κ² νκ³ μ¬κΈ°μ λ
Όμλ κΈ°μ μ νκ³λ₯Ό (μΌμ’
μ) μ΄ν΄νμ§λ§ λ¬Έμκ° λ¨μν νμ¬μ νλκ³Ό μΌμΉνμ§ μλλ€κ³ μκ°ν©λλ€.
μλ₯Ό λ€μ΄ mapLimitμ κ²½μ° "λ°ν: μ½λ°±μ΄ μ λ¬λμ§ μμ κ²½μ° μ½μ"μ΄λΌκ³ νμλ©λλ€. - μ λ μ½λ°± λ²μ μΌλ‘ μμν λ€μ κΈ°λ³Έμ μΌλ‘ μ½λ°±μ μλ΅νκ³ μ½μμ μ»μ§ λͺ»ν κ²μ λλμ΅λλ€. 'λΉλκΈ°' ν€μλ).
λν iteratee ν¨μμ 'callback' λ¬Έμ νμνμ§ μμΌλ©° λμ κ°μ 'λ°ν'ν΄μΌ ν©λλ€.
λ°λΌμ νΌλμ νΌνκΈ° μν΄ λμμ λ³κ²½(μ νΈ)νκ±°λ μ΅μν λ¬Έμμ μμ λ₯Ό λ΄ κ΄μ μμ μ λ ¬ν΄μΌ ν©λλ€.
@caub μ΄κ²μ΄ μ΄μ μ
λλ€
https://github.com/caolan/async/blob/8aecf108b3922bc5211036706a0f6f75e02bd42b/lib/internal/wrapAsync.js#L3 :L5
function isAsync(fn) {
return fn[Symbol.toStringTag] === 'AsyncFunction';
}
μ΄λ κ² νλ©΄ μ€μ λ‘ νΈμΆνμ§ μκ³ ν¨μκ° μ½μμ λ°ννλμ§ νμΈνλ κ²μ΄ λ μ½μ΅λλ€. κ·Έλ¬λ μ΄κ²μ΄ async/await κ·μΉμ μλ°°λλ€λ μ μλ μ¬μ ν λμν©λλ€. λ΄λΆ await
μμ΄ async
ν€μλλ₯Ό μΆκ°νλ κ²μ μ€μ λ‘ λλΆλΆμ κ²½μ° λμ μ΅κ΄μΌλ‘ κ°μ£Όλ©λλ€.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_functionμμ
async
ν¨μμ λ³Έλ¬Έμ 0κ° μ΄μμ await ννμμΌλ‘ λΆν λλ κ²μΌλ‘ μκ°ν μ μμ΅λλ€. 첫 λ²μ§Έ await ννμ(μλ κ²½μ°)κΉμ§ ν¬ν¨νλ μ΅μμ μ½λλ λκΈ°μμΌλ‘ μ€νλ©λλ€.
... κ·Έλμ μΈλͺ¨μκ³ μ΅μ
μ κ²½μ° μ½λκ° babelμ μν΄ νΈλμ€νμΌλλ κ²½μ° μ½κ°μ μ±λ₯ μ€λ²ν€λκ° μΆκ°λ©λλ€. μλ₯Ό λ€μ΄ async
ν€μλκ° μκΈ° λλ¬Έμ λ λ§μ μ½λμ λ¨κ³κ° μΆκ°λκΈ° λλ¬Έμ
λλ€.
μλ₯Ό λ€λ©΄ λ€μκ³Ό κ°μ΅λλ€.
async function foo() { return 1 }
... λ€μκ³Ό λμΌν©λλ€.
function foo() { return Promise.resolve(1) }
νμ§λ§ μ΄ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ©΄
async.mapLimit([1], 1, async v => v)
그리κ³
async.mapLimit([1], 1, v => Promise.resolve(v)))
λλ±νμ§ μμ΅λλ€!
κ°μ₯ μ μ©ν λκΈ
μ΄ λ¬Έμ κ° μ’ λ£λ μνμμλ μμ λ§ν¬λ λ¬Έμ μ κ°μ΄ μ¬κΈ°μ @caub λ¬Έμ λ€μ κ°μ‘°νκ³ μΆμ΅λλ€.
νμ¬μ νλμ λλ₯Ό λ§μ΄ νΌλμ€λ½κ² νκ³ μ¬κΈ°μ λ Όμλ κΈ°μ μ νκ³λ₯Ό (μΌμ’ μ) μ΄ν΄νμ§λ§ λ¬Έμκ° λ¨μν νμ¬μ νλκ³Ό μΌμΉνμ§ μλλ€κ³ μκ°ν©λλ€.
μλ₯Ό λ€μ΄ mapLimitμ κ²½μ° "λ°ν: μ½λ°±μ΄ μ λ¬λμ§ μμ κ²½μ° μ½μ"μ΄λΌκ³ νμλ©λλ€. - μ λ μ½λ°± λ²μ μΌλ‘ μμν λ€μ κΈ°λ³Έμ μΌλ‘ μ½λ°±μ μλ΅νκ³ μ½μμ μ»μ§ λͺ»ν κ²μ λλμ΅λλ€. 'λΉλκΈ°' ν€μλ).
λν iteratee ν¨μμ 'callback' λ¬Έμ νμνμ§ μμΌλ©° λμ κ°μ 'λ°ν'ν΄μΌ ν©λλ€.
λ°λΌμ νΌλμ νΌνκΈ° μν΄ λμμ λ³κ²½(μ νΈ)νκ±°λ μ΅μν λ¬Έμμ μμ λ₯Ό λ΄ κ΄μ μμ μ λ ¬ν΄μΌ ν©λλ€.