이 코드를 작성했습니다. lib/helper.js
var myfunction = async function(x,y) {
....
reutrn [variableA, variableB]
}
exports.myfunction = myfunction;
그런 다음 다른 파일에서 사용하려고했습니다.
var helper = require('./helper.js');
var start = function(a,b){
....
const result = await helper.myfunction('test','test');
}
exports.start = start;
오류가 발생했습니다
“await는 비동기 함수에서만 유효합니다.”
이슈가 뭐야?
답변
오류는 참조가 myfunction
아니라 start
.
async function start() {
....
const result = await helper.myfunction('test', 'test');
}
// My function
const myfunction = async function(x, y) {
return [
x,
y,
];
}
// Start function
const start = async function(a, b) {
const result = await myfunction('test', 'test');
console.log(result);
}
// Call start
start();
내가 사용하여 알려진 안티 패턴에 대해 조언이 질문의 기회를 사용 await
하다 : return await
.
잘못된
async function myfunction() {
console.log('Inside of myfunction');
}
// Here we wait for the myfunction to finish
// and then returns a promise that'll be waited for aswell
// It's useless to wait the myfunction to finish before to return
// we can simply returns a promise that will be resolved later
// useless async here
async function start() {
// useless await here
return await myfunction();
}
// Call start
(async() => {
console.log('before start');
await start();
console.log('after start');
})();
옳은
async function myfunction() {
console.log('Inside of myfunction');
}
// Here we wait for the myfunction to finish
// and then returns a promise that'll be waited for aswell
// It's useless to wait the myfunction to finish before to return
// we can simply returns a promise that will be resolved later
// Also point that we don't use async keyword on the function because
// we can simply returns the promise returned by myfunction
function start() {
return myfunction();
}
// Call start
(async() => {
console.log('before start');
await start();
console.log('after start');
})();
또한 return await
정확하고 중요한 특별한 경우가 있음을 알고 있어야합니다 . (try / catch 사용)
답변
이 오류가 발생했을 때 “async”함수 내에서 map 함수를 호출 한 것으로 나타났습니다. 따라서이 오류 메시지는 실제로 “async”로 표시되지 않은 맵 함수를 참조하는 것입니다. 이 문제를 해결하려면 map 함수에서 “await”호출을 받고 예상되는 동작을 얻는 다른 방법을 생각해 냈습니다.
var myfunction = async function(x,y) {
....
someArray.map(someVariable => { // <- This was the function giving the error
return await someFunction(someVariable);
});
}
답변
를 사용하려면 await
실행 컨텍스트가 async
본질적으로 있어야합니다.
말했듯이, 당신 executing context
은 await
무엇보다 먼저 당신이 할 일을 기꺼이하는 당신 의 성격을 정의 할 필요가 있습니다.
작업을 실행할 선언 async
앞에 넣으 fn
십시오 async
.
var start = async function(a, b) {
// Your async task will execute with await
await foo()
console.log('I will execute after foo get either resolved/rejected')
}
설명:
귀하의 질문에 귀하는 본질적으로 병렬로 실행 method
되는을 가져오고 asynchronous
있습니다. 그러나 그 async
메소드 를 실행하려는 곳은 사용 execution context
하기 위해 정의 해야하는 다른 내부 async
에 있습니다 await
.
var helper = require('./helper.js');
var start = async function(a,b){
....
const result = await helper.myfunction('test','test');
}
exports.start = start;
후드 아래에서 무슨 일이 일어나고 있는지 궁금해
await
약속 / 미래 / 작업 반환 방법 / 함수 async
를 사용하고 await를 사용할 수있는 방법 / 함수를 표시합니다.
또한 당신은 잘 알고있는 경우 promises
, await
실제로 약속 / 해결의 동일한 프로세스를하고있다. 약속 체인을 만들고 resolve
콜백 에서 다음 작업을 실행합니다 .
자세한 내용은 MDN DOCS를 참조하십시오 .
답변
async
/ 의 현재 구현은 함수 내부의 키워드 await
만 지원합니다 . 내부에서 사용할 수 있도록 함수 서명을 변경하십시오 .await
async
start
await
start
var start = async function(a, b) {
}
관심있는 사람들을 위해 최상위 수준에 대한 제안 await
은 현재 2 단계에 있습니다. https://github.com/tc39/proposal-top-level-await
답변
나는 동일한 문제가 있었고 다음 코드 블록이 동일한 오류 메시지를 표시했습니다.
repositories.forEach( repo => {
const commits = await getCommits(repo);
displayCommit(commits);
});
문제는 getCommits () 메소드가 비동기 였지만 Promise에 의해 생성 된 인수 저장소를 전달하고 있다는 것입니다. 그래서 다음과 같이 async라는 단어를 추가해야했습니다 : async (repo) 그리고 작동하기 시작했습니다.
repositories.forEach( async(repo) => {
const commits = await getCommits(repo);
displayCommit(commits);
});
답변
async / await는 promise를 처리하는 메커니즘으로, 두 가지 방법으로 수행 할 수 있습니다.
functionWhichReturnsPromise()
.then(result => {
console.log(result);
})
.cathc(err => {
console.log(result);
});
또는 await를 사용하여 약속이 먼저 가득 채워질 때까지 기다릴 수 있습니다. 이는 거부되거나 해결되었음을 의미합니다.
이제 함수 내에서 await (Promise가 이행되기를 기다리는 중) 를 사용하려면 , 우리가 비동기 적으로 이행 할 약속을 기다리고 있기 때문에 컨테이너 함수는 반드시 비동기 함수 여야합니다 || 말이 맞습니까?.
async function getRecipesAw(){
const IDs = await getIds; // returns promise
const recipe = await getRecipe(IDs[2]); // returns promise
return recipe; // returning a promise
}
getRecipesAw().then(result=>{
console.log(result);
}).catch(error=>{
console.log(error);
});
답변
“await는 비동기 함수에서만 유효합니다.”
그런데 왜? ‘await’는 명시 적으로 비동기 호출을 동기 호출로 전환하므로 호출자는 비동기 (또는 비동기)가 될 수 없습니다. 적어도 ‘await’에서 호출이 이루어지기 때문이 아닙니다.