[javascript] 함수의 변수를 반환하기 전에 약속이 완료되기를 기다리는 방법은 무엇입니까?

나는 여전히 약속으로 어려움을 겪고 있지만 여기의 커뮤니티 덕분에 진전이 있습니다.

Parse 데이터베이스를 쿼리하는 간단한 JS 함수가 있습니다. 결과 배열을 반환해야하지만 쿼리의 비동기 특성 (따라서 약속)으로 인해 함수가 결과보다 먼저 반환되어 정의되지 않은 배열을 남겨 둡니다.

이 함수가 약속의 결과를 기다리게하려면 어떻게해야합니까?

내 코드는 다음과 같습니다.

function resultsByName(name)
{   
    var Card = Parse.Object.extend("Card");
    var query = new Parse.Query(Card);
    query.equalTo("name", name.toString());

    var resultsArray = [];

    var promise = query.find({
               success: function(results) {
               // results is an array of Parse.Object.
                             console.log(results);
                             //resultsArray = results;
                             return results;
               },

               error: function(error) {
               // error is an instance of Parse.Error.
                             console.log("Error");
               }
    });                           

}



답변

a resultsArray를 반환하는 대신 결과 배열에 대한 약속을 반환 한 다음 then호출 사이트 에서 약속을 반환 하면 호출자가 함수가 비동기 I / O를 수행한다는 것을 알 수 있습니다. JavaScript의 동시성 코딩은이를 기반으로합니다 . 더 넓은 아이디어를 얻으려면 이 질문 을 읽으십시오 .

function resultsByName(name)
{   
    var Card = Parse.Object.extend("Card");
    var query = new Parse.Query(Card);
    query.equalTo("name", name.toString());

    var resultsArray = [];

    return query.find({});                           

}

// later
resultsByName("Some Name").then(function(results){
    // access results here by chaining to the returned promise
});

Parse의 자체 블로그 게시물 에서 쿼리와 함께 구문 분석 약속을 사용하는 더 많은 예를 볼 수 있습니다 .


답변

이 함수가 약속의 결과를 기다리게하려면 어떻게해야합니까?

사용 async/await(ECMA6의 일부지만, 크롬, 에지, 파이어 폭스와 2017의 말부터 사파리에 해당하는, 참조 canIuse )

MDN

    async function waitForPromise() {
        // let result = await any Promise, like:
        let result = await Promise.resolve('this is a sample promise');
    }

주석으로 인해 추가됨 : 비동기 함수는 항상 Promise를 반환하며 TypeScript에서는 다음과 같습니다.

    async function waitForPromise(): Promise<string> {
        // let result = await any Promise, like:
        let result = await Promise.resolve('this is a sample promise');
    }


답변

JavaScript는 비 블로킹을 목적으로하기 때문에 함수를 기다리지 않으려 고합니다. 대신 함수의 끝에서 약속을 반환하면 호출 함수는 약속을 사용하여 서버 응답을 얻을 수 있습니다.

var promise = query.find(); 
return promise; 

//Or return query.find(); 


답변

실제로 약속을 사용하고 있지 않습니다. 구문 분석을 통해 콜백 또는 약속을 사용할 수 있습니다. 당신의 선택.

약속을 사용하려면 다음을 수행하십시오.

query.find().then(function() {
    console.log("success!");
}, function() {
    console.log("error");
});

이제 약속이 완료된 후 물건을 실행하려면 then()통화 안의 약속 콜백 안에서만 실행할 수 있습니다 . 지금까지 이것은 일반 콜백과 정확히 동일합니다.

실제로 약속을 잘 활용하려면 다음과 같이 약속을 묶는 것입니다.

query.find().then(function() {
    console.log("success!");

    return new Parse.Query(Obj).get("sOmE_oBjEcT");
}, function() {
    console.log("error");
}).then(function() {
    console.log("success on second callback!");
}, function() {
    console.log("error on second callback");
});


답변