[javascript] await는 비동기 함수에서만 유효합니다.

이 코드를 작성했습니다. 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 사용)

‘return await’에 성능 문제가 있습니까?


답변

이 오류가 발생했을 때 “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 contextawait무엇보다 먼저 당신이 할 일을 기꺼이하는 당신 의 성격을 정의 할 필요가 있습니다.

작업을 실행할 선언 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만 지원합니다 . 내부에서 사용할 수 있도록 함수 서명을 변경하십시오 .awaitasyncstartawaitstart

 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’에서 호출이 이루어지기 때문이 아닙니다.