[javascript] 약속에서 반환 then ()

다음과 같은 자바 스크립트 코드가 있습니다.

function justTesting() {
  promise.then(function(output) {
    return output + 1;
  });
}

var test = justTesting();

항상 var 테스트에 대해 정의되지 않은 값이 있습니다. 약속이 아직 해결되지 않았기 때문이라고 생각합니다 .. 약속에서 값을 돌려주는 방법이 있나요?



답변

then()콜백 에서 무언가를 반환 하는 것은 약간의 마술입니다. 값을 반환하면 다음 then()값이 해당 값으로 호출됩니다. 그러나 약속과 같은 것을 반환하면 다음 약속이 then()대기하고 해당 약속이 해결 될 때만 호출됩니다 (성공 / 실패).

출처 : https://developers.google.com/web/fundamentals/getting-started/primers/promises#queuing-asynchronous-actions


답변

promise를 사용하려면 promise를 생성하는 함수를 호출하거나 직접 생성해야합니다. 실제로 해결하려는 문제가 무엇인지 설명하지는 않지만 다음은 직접 약속을 만드는 방법입니다.

function justTesting(input) {
    return new Promise(function(resolve, reject) {
        // some async operation here
        setTimeout(function() {
            // resolve the promise with some value
            resolve(input + 10);
        }, 500);
    });
}

justTesting(29).then(function(val) {
   // you access the value from the promise here
   log(val);
});

// display output in snippet
function log(x) {
    document.write(x);
}

또는 약속을 반환하는 함수가 이미있는 경우 해당 함수를 사용하고 약속을 반환 할 수 있습니다.

// function that returns a promise
function delay(t) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve();
    }, t);
  });
}

function justTesting(input) {
  return delay(100).then(function() {
    return input + 10;
  });
}

justTesting(29).then(function(val) {
  // you access the value from the promise here
  log(val);
});

// display output in snippet
function log(x) {
  document.write(x);
}


답변

내가 여기서 한 것은 justTesting 함수에서 promise를 반환 한 것입니다. 그런 다음 함수가 해결되면 결과를 얻을 수 있습니다.

// new answer

function justTesting() {
  return new Promise((resolve, reject) => {
    if (true) {
      return resolve("testing");
    } else {
      return reject("promise failed");
   }
 });
}

justTesting()
  .then(res => {
     let test = res;
     // do something with the output :)
  })
  .catch(err => {
    console.log(err);
  });

도움이 되었기를 바랍니다!

// old answer

function justTesting() {
  return promise.then(function(output) {
    return output + 1;
  });
}

justTesting().then((res) => {
     var test = res;
    // do something with the output :)
    }


답변

약속의 혼란을 없애기 위해 “await”명령과 비동기 함수를 사용하는 것을 선호합니다.

이 경우 먼저 비동기 함수를 작성합니다.이 질문의 “promise.then”부분에서 호출되는 익명 함수 대신 사용됩니다.

async function SubFunction(output){

   // Call to database , returns a promise, like an Ajax call etc :

   const response = await axios.get( GetApiHost() + '/api/some_endpoint')

   // Return :
   return response;

}

그런 다음 주 함수에서이 함수를 호출합니다.

async function justTesting() {
   const lv_result = await SubFunction(output);

   return lv_result + 1;
}

여기서는 주 함수와 하위 함수를 모두 비동기 함수로 반환했습니다.


답변