2017-10-01 1 views
0

내가 이벤트 중심의 프로젝트 내에서 기다리고 비동기를 사용하기 위해 노력하고있어 나는 다음과 같은 오류를 얻고있다 Node.js를) :비동기 이벤트를 기다리는 동안 기다리고

const fs = require('fs'); 
const dash_button = require('node-dash-button'); 
const dash = dash_button(process.env.DASH_MAC, null, 1000, 'all'); 

function readFileAsync (path) { 
    return new Promise(function (resolve, reject) { 
     fs.readFile(path, function (error, result) { 
      if (error) { 
       reject(error); 
      } else { 
       resolve(result); 
      } 
     }); 
    }); 
}; 

async function main() { 
    dash.on("detected", function() { 
     tmpFile = await readFileAsync('tmp.png'); 
     console.log(tmpFile); 
    }); 
} 

main(); 

내 문제는 아래의 라이브러리와 정말 것이 아니라 오히려 비동기로 기초를 기다리고 있습니다 이해 및 이벤트 구동 스크립트에서 그것을 사용. 이것이 범위 지정 문제인지 또는 다른 것이 아닌지 나는 꽤 이해하지 못합니다.

나는 아마존 대시 버튼에 대한 다음과 같은 이벤트 기반 라이브러리를 사용하고 있습니다 : await 요구

답변

2

사용이 async() 함수 내에서 될

앤디 https://github.com/hortinstein/node-dash-button

감사합니다.

async function main() { 
    return await new Promise(resolve => { 
        dash.on("detected", async() => { 
        resolve(await readFileAsync('tmp.png')); 
        }); 
       }) 
} 

main().then(tmpFile => console.log(tmpFile)); 
+2

OP가'detected' 이벤트가 여러 번 시작될 것으로 예상하는 경우, 이것은 첫 번째 이벤트 만 올바르게 포착합니다. – JLRishe

+0

@JLRishe 좋은 지적. node.js 사용 경험이 거의 없습니다. Mark_M의 접근 방식은이 경우 예상되는 결과를 제공해야합니다. – guest271314

+0

함수 내부에서 중간 결과를 사용하지 않기 때문에'async/await'를 사용할 필요가 없습니다. '새로운 약속을 되 찾으십시오 (....)'충분합니다. – alexmac

5

잘못된 기능에 비동기가 있습니다. 이 콜백에 있어야합니다 : 그 직접 await 전화를 둘러싼 함수로

function main() { 
    dash.on("detected", async function() { 
     tmpFile = await readFileAsync('tmp.png'); 
     console.log(tmpFile); 
    }); 
} 
+0

그리스도는 자전거를 타다 - 나는 단순 해! 그 마크를 주셔서 감사합니다. (p.s. 나는 downvoted하지 않았습니다. 다른 사람이되어 있어야합니다.) – Garbit

+2

async/await을 사용하기 시작했을 때 똑같은 일을했기 때문에 나는 단지 빠른 대답을했습니다. –

2

await only affects the innermost async function that surrounds it and can only be used directly inside async functions

콜백이 async 기능이 있어야한다.

함수는 await 호출을 직접 랩핑하지 않는 한 async 함수 일 필요는 없습니다.