2016-11-02 3 views
0

How do I return the response from an asynchronous call?에서 '사용 약속'섹션을 읽거나 시도했지만 해당 예제에는 매개 변수가 포함되어 있지 않습니다 (하지만 아래 코드에서 정상적으로 전달 된 것 같습니다) 유사한 코드를 추가했을 때도 작동하지 않습니다 (아래 참조). 내가 십자가에 오게 한 다른 어떤 것도 코드 작업에 가깝게 접근하지 못했습니다. 본질적으로 'callingFunction'은 onLoad 동안 호출되며 매개 변수를 myDialog에 전달하고 알림을 계속하기 전에 사용자 응답을 기다려야합니다 (이 단순화 된 예제에서). 이제는 '시작'및 '종료'경고가 표시되는 방식으로 대화 상자가 표시됩니다. 두 버튼 중 하나를 클릭하면 (처음으로 만) '죄송합니다'라고 표시됩니다. 따라서 코드는 현재 약속 배달을 기다리지 않고 해결 값을 올바르게 확인하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?약속 및 매개 변수 전달을 사용하여 작업중인 자바 스크립트 대화 상자를 시도하는 중

function myDialog(question) { 
return new Promise(function(resolve, reject) { 

    var box = document.createElement('div'); 
    box.style.position = "absolute"; 
    box.style.top = "300px"; 
    box.style.left = "300px"; 
    box.style.width = "200px"; 
    box.style.height = "100px"; 

    var text = document.createTextNode(question); 
    text.margin = "20px"; 
    box.appendChild(text); 

    var button_yes = document.createElement("button"); 
    button_yes.innerHTML = "Yes"; 
    button_yes.onclick = function() { resolve(true); } 
    box.appendChild(button_yes); 

    var button_no = document.createElement("button"); 
    button_no.innerHTML = "No"; 
    button_no.onclick = function() { resolve(false); } 
    box.appendChild(button_no); 

    window.parent.document.body.appendChild(box); 
}) 
} 

function callingFunction(question) { 
    alert('start'); 
    myDialog(question).then(function(v) { 
    window.parent.document.body.removeChild(box); 
    if (v == true) { 
      alert('true selected'); 
     }else{ 
      alert('false selected'); 
     } 
    }).catch(function(v) { 
     alert('oops'); 
    }); 
    alert('end'); 
} 

답변

0

그래서 코드는 현재 약속 배달을 기다리고 있지 않거나 올바르게 해결의 가치를 인정.

실제로는 그렇습니다. 범인이 무엇인지 알아보기 위해 v 값을 경고하거나 로깅 해보십시오. 당신의 box 변수는 myDialog의 약속 콜백 범위가 - 오류 메시지가 box가 완전히 정확 라인

window.parent.document.body.removeChild(box); 

에 정의되지 않은 것을 말하는거야. 당신은 사용할 수 있습니다

function myDialog(question) { 
    return new Promise(function(resolve, reject) { 
    var container = window.parent.document.body 
    var box = document.createElement('div'); 
    box.style.position = "absolute"; 
    box.style.top = "300px"; 
    box.style.left = "300px"; 
    box.style.width = "200px"; 
    box.style.height = "100px"; 

    var text = document.createTextNode(question); 
    text.margin = "20px"; 
    box.appendChild(text); 

    var button_yes = document.createElement("button"); 
    button_yes.textContent = "Yes"; 
    button_yes.onclick = function() { 
     resolve(true); 
     container.removeChild(box); 
    }; 
    box.appendChild(button_yes); 

    var button_no = document.createElement("button"); 
    button_no.textContent = "No"; 
    button_no.onclick = function() { 
     resolve(false); 
     container.removeChild(box); 
    }; 
    box.appendChild(button_no); 

    container.appendChild(box); 
    }); 
} 

function callingFunction(question) { 
    alert('start'); 
    myDialog(question).then(function(v) { 
    alert(v+' selected'); 
    }).catch(function(e) { 
    alert('something went wrong: '+e); 
    }); 
} 
+0

다른 눈의 쌍을 가져 주셔서 감사합니다! 이번에는 상자 오류가 발생하지 않았지만 적절한 값을 해결하는 문제가 해결되었습니다. 이제 약속 끝내기를 기다리는 방법을 경고 끝을 표시하기 전에 설정합니까? 해결 값을 먼저 필요로하는 'end'다음에 코드를 실행하고 있습니다. –

+0

'alert (v + 'selected')'직후'then' 콜백 안에'alert (end)'를 넣어야합니다. 바깥으로 가져 가면 결코 작동하지 않을 것입니다 - 비동기의 멋진 세계에 오신 것을 환영합니다! – Bergi

+0

아, 알았다. 아무것도 아닌 것보다 낫다는 것을 짐작하십시오. 외부 코드를 단순한 함수 호출로 유지하여 추가 코드 용 변수를 설정하고자했습니다. 통찰력을 가져 주셔서 대단히 감사합니다. –

관련 문제