2017-09-28 3 views
0

js 약속을 사용하여 값을 데이터베이스에 저장 한 후 페이지를 새로 고침하고 싶습니다.다른 약속이 약속을 사용하여 완료된 후에 Javascript 기능을 실행하는 방법은 무엇입니까?

내 코드는 jQuery를 이벤트 리스너 내부에 싸여있다 :

$("img[class=okButton]").click(function(){ 
    var field_userid = $(this).attr("id"); 

    doThisFirst(); 

    // then make a promise 
    const wait = ms => new Promise(resolve => setTimeout(resolve, ms)); 
    wait(500).then(() => writeNewRoom(field_userid)); // function to write to database 

    refreshPage(); // after write has finished 
}); 

/////////////////// 

function writeNewRoom(field_userid)){ 
// ajax to do something; 
} 

/////////////////// 

function refreshPage(){ 
if(window.confirm("Click to refresh")){location = location} 
} 

의도 된 행동이 후, 처음으로 데이터를 처리합니다 (refreshPage에서 페이지를 새로 고침하기 전에)합니다 (writeNewRoom에서 "일을"기능을 종료하는 것입니다) 기능.

실제로는 첫 번째 doThisFirst() 함수가 올바르게 처리되지만 세 번째 함수의 window.confirm 상자는 writeNewRoom 함수가 실행되기 전에 팝업됩니다.

나는 전에 약속을 한 번도 사용하지 않았으므로 누구든지 잘못 된 것을 알아낼 수 있습니까? mozilla 웹 사이트에서 기본 구문을 사용했습니다. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

모든 도움을 주시면 감사하겠습니다.

+0

'.then' 콜백 내부에서 수행합니까? – jonrsharpe

+1

[promise chaining] (https://javascript.info/promise-chaining#returning-promises) 도움이 될까요? – evolutionxbox

답변

0

귀하의 경우 writeNewRoom() 방법으로 다시 전화를 걸고 싶습니다.

예를 들어 .click() 함수에서 수행해야하는 작업을 호출하고 데이터베이스 작성을위한 아약스 호출이 완료되면 .done() 메서드를 호출합니다. 당신의 // ajax to do something; 반환하는 경우

$("img[class=okButton]").click(function(){ 
    var field_userid = $(this).attr("id"); 

    doThisFirst(); 

    // Remove the Promise 
    writeNewRoom(field_userid); // function to write to database 
}); 

function writeNewRoom(field_userId) { 
    $.ajax({ 
     url: "/someurl", 
     method: "method", 
     data: { 
      a: field_userId 
     } 
    }).done(function(data) { 
     console.log('success', data) 
     refreshPage(); // This is where you refresh the page. 
    }).fail(function(xhr) { 
     console.log('error', xhr); 
    }); 
} 
+0

왜냐하면'writeNewRoom'은 아마 ajax 때문에 async가 될 것이기 때문입니다. – floriangosse

+0

@floriangosse'writeNewRoom()'이 (가) 비동기 였음을 알지 못했습니까? 그것을 고정했다 – JustinJmnz

+1

JustinJmnz,이 트릭을 했어, 비록 '$ .ajax()'대신 jQuery '$ .post()'함수를 사용했습니다. 약속이 예상대로 작동하지 않는다는 사실이 나에게 발생합니다 ... 실제로 게시 결과에서 다시로드를 트리거하면 아마도 필요한 동작을 얻으려는 약속이 전혀 필요하지 않을 것입니다. –

-1

약속 (jQuery.ajax() 않습니다) 당신이 이런 식으로 작업을 수행 할 수 있습니다

wait(500).then(() => writeNewRoom(field_userid)) 
     .then(() => refreshPage()); 

가이기도 여기 function writeNewRoom(field_userid))

+0

감사합니다. 나는 이것을 시도했지만 불행히도 그것은 작동하지 않습니다. 이전과 같은 동작. –

-1

하나 추가 괄호 writeNewRoom(field_userid) 인 경우 ajax 호출을 수행하면 refreshPage() -function을 ajax 호출의 콜백에 넣으므로 Ajax가 완료된 후 실행됩니다. 예 :

function writeNewRoom(field_userid)){ 

    $.ajax({ 
     url: "someUrl", 
     type: 'GET', 
     success: (result) => { 
      refreshPage() //when ajax has succeded, refresh page 
     }, 
     error: (err) => { 
     //do something else 

     } 
    }); 

} 
관련 문제