2017-09-16 3 views
0

나는 배경 스크립트와 크롬 확장 프로그램을 연결하고 있어요. 간단한 동기 호출의 경우 제대로 작동합니다. 나는 메시지를 보내고 응답을 받는다.사용 onMessage.addListener의 sendResponse 비동기

내부적으로 Dexie 약속과 함께 IndexedDB를 사용하는 getValue은 단순한 sendResponse을 사용할 수 없습니다. 나는 이것을 처리하는 방법이 메시지를 응답으로 보내는 것임을 알았다. 그러나 나를 위해, 그것은 실제로 이해가되지 않습니다. 백그라운드 스크립트는 특정 키 값을 데이터베이스에서 찾을 수 있는지 여부를 단순히 확인합니다. 확장 기능은 키 값이 반환 될 때까지 차단되어야합니다.

나는이 어떻게 든 sendResponse를 사용하는 풀다 수 있을까요? 아마도 return findData()을 동기 함수로 감싸고 있을까요?

chrome.runtime.sendMessage({ 
    request:'getValue', 
    key: shortcutKey 
}, (data) => { 
    debugLog('getShortcut:', data); 
    let value = data.value; 
    console.log(`for key: ${key} found ${value}`); 
    ... 
    do_my_thing(); 
}); 

배경 스크립트 :

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 
    switch (request.name) { 
    case 'getClipboard': 
     sendResponse({clipboard:getClipboard()}); 
     break; 
    case 'getValue': 
     console.log(`background::getValue handler key:`, request.key); 
     return findData(request.key.substring(constants.PREFIX.length)).then((result) => { 
     console.log(`findData return: ${result}`); 
     sendResponse({ value: result }); 
     }); 
     break; 
     ... 
    } 
}); 
+1

https://developer.chrome.com/extensions/messaging에서 비동기적인 단락을 읽었습니까? 이 indexDB를 사용 –

+0

경우, 동기화 할 수있는 방법은 없습니다. – dandavis

답변

1

그냥 return true asyncronius의 경우에!

주 : sendResponse 콜백은 동 기적으로 사용되거나 이벤트 처리기가 비동기 적으로 응답 함을 나타내는 true를 반환하는 경우에만 유효합니다. true를 반환하는 핸들러가 없거나 sendResponse 콜백이 가비지 수집 된 경우 sendMessage 함수의 콜백이 자동으로 호출됩니다. https://developer.chrome.com/apps/messaging

+0

'sendResponse()'아래에'return true;를 추가하는 것은 작동하지 않습니다. 내 '데이터'는 '정의되지 않음'입니다. 따라서 질문하고 있습니다. –

+0

findData 전에 "return"staement를 제거 했습니까? –

+0

또한 아래의 sendResponse(); 'break'대신 'case'의 끝 부분에 추가하십시오. 동일한 문서의 –