약속의 가치에 접근하는 방법?


146

나는 Angular의 문서 에서이 예제를보고 $q있지만 이것이 일반적으로 약속에 적용될 것이라고 생각합니다. 아래 예제는 주석이 포함 된 문서에서 그대로 복사됩니다.

promiseB = promiseA.then(function(result) {
  return result + 1;
});

// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1

이것이 어떻게 작동하는지 잘 모르겠습니다. .then()첫 번째 결과를 호출 하여 .then()연결할 수있는 체인을 연결하면 promiseB유형의 약속 객체입니다 Object. 이 아닙니다 Number. "그 값은 promiseA의 결과가 1 씩 증가합니다"라는 의미는 무엇입니까?

내가 그런 식으로 접근 promiseB.value해야합니까? 성공 콜백은 어떻게 약속을 반환하고 "결과 + 1"을 반환 할 수 있습니까? 뭔가 빠졌습니다.



1
이것이 귀하의 질문에 대답합니까? 비동기 호출에서 응답을 어떻게 반환합니까?
Heretic Monkey

이 질문은 5 살이고 답변
temporary_user_name 1

@temporary_user_name : 사람들은 오래된 질문에 대해 언제든지 투표를 할 수 있습니다.
halfer

답변:


141

promiseAthen함수는 promiseB해결 된 후 즉시 해결 되는 새로운 약속 ( )을 반환하며 promiseA, 그 값은에있는 성공 함수에서 반환 된 값입니다 promiseA.

이 경우 promiseA값으로 확인 된 result다음 즉시 promiseB값으로 확인 result + 1됩니다.

에 대한 액세스는 promiseB의 결과에 액세스하는 것과 같은 방식으로 수행됩니다 promiseA.

promiseB.then(function(result) {
    // here you can use the result of promiseB
});

2019 년 12 월 편집 : async/ await은 이제 JS의 표준으로, 위에서 설명한 접근법에 대한 대체 구문을 허용합니다. 이제 쓸 수 있습니다 :

let result = await functionThatReturnsPromiseA();
result = result + 1;

우리는 promiseA를 사용하여 promiseA의 결과를 풀었으므로 promiseB가 없으며 await직접 작업 할 수 있습니다.

그러나 함수 await내에서만 사용할 수 있습니다 async. 따라서 약간 축소하려면 위와 같이 포함해야합니다.

async function doSomething() {
    let result = await functionThatReturnsPromiseA();
    return result + 1;
}

2
약속은 이론적으로 자신의 목표입니다. 약속의 성공 함수를 통해 액세스 할 수있는 결과가 포함됩니다.
Nachshon Schwartz

2
따라서 약속의 비동기 콜백의 반환 값으로 작업하려면 다른 비동기 콜백 내에서 수행해야합니다. 말이된다. 나는 궁극적 인 원시 반환 값을 얻는 방법을 찾고 있었지만 컨텍스트가 주어진 이유를 무시할 것이라고 생각합니다.
temporary_user_name

2
@ Aerovistae 실제로 ES6는 이것을 가능하게하는 생성기를 도입하고 ES7은 비동기 함수를 도입합니다. 두 기능 모두 백그라운드에서 상태 머신을 실행하여 동기 코드처럼 보이게하는 약속보다 구문 설탕을 제공하므로 단단히 유지하십시오 :)
Benjamin Gruenbaum

25

약속이 해결 / 거부되면 성공 / 오류 처리기를 호출합니다.

var promiseB = promiseA.then(function(result) {
   // do something with result
});

then메소드는 promise : promiseB를 리턴하며 promiseA 의 성공 / 오류 핸들러의 리턴 값에 따라 해결 / 거부 됩니다.

promiseA의 성공 / 오류 핸들러가 promiseB의 결과에 영향을 줄 수있는 세 가지 가능한 값이 있습니다.

1. Return nothing --> PromiseB is resolved immediately, 
   and undefined is passed to the success handler of promiseB
2. Return a value --> PromiseB is resolved immediately,
   and the value is passed to the success handler of promiseB
3. Return a promise --> When resolved, promiseB will be resolved. 
   When rejected, promiseB will be rejected. The value passed to
   the promiseB's then handler will be the result of the promise

이러한 이해를 바탕으로 다음을 이해할 수 있습니다.

promiseB = promiseA.then(function(result) {
  return result + 1;
});

then 호출은 promiseB를 즉시 반환합니다. promiseA가 해결되면 결과를 promiseA의 성공 처리기로 전달합니다. 리턴 값은 promiseA의 결과 + 1이므로 성공 핸들러는 값 (위의 옵션 2)을 리턴하므로 promiseB는 즉시 해결되며 promiseB의 성공 핸들러는 promiseA의 결과 + 1을 전달합니다.


4

.thenpromiseB의 함수는 promiseA의 함수에서 반환 된 내용 .then을받습니다.

여기서 promiseA가 반환하는 숫자 number는 promiseB의 성공 함수에서 매개 변수 로 사용할 수 있습니다 . 그런 다음 1 씩 증가합니다


3

의견을 현재 이해하는 것과 약간 다르게 해석하면 도움이 될 수 있습니다.

// promiseB will be resolved immediately after promiseA is resolved

이것은 promiseB약속이지만 해결 된 직후에 해결 될 것임을 나타 promiseA냅니다. 이것을 보는 또 다른 방법 promiseA.then()은에 지정된 약속을 반환 한다는 의미입니다 promiseB.

// and its value will be the result of promiseA incremented by 1

이는 promiseA해결 된 값이 promiseBsuccessCallback 값으로 수신되는 값임을 의미합니다.

promiseB.then(function (val) {
  // val is now promiseA's result + 1
});

2

pixelbits 응답은 정확하며 항상 .then()프로덕션 코드에서 약속의 가치에 액세스하는 데 사용해야 합니다.

그러나 지원되지 않는 다음 내부 node.js 바인딩을 사용하여 약속 값이 해결 된 후 바로 약속 값에 액세스 할 수 있습니다.

process.binding('util').getPromiseDetails(myPromise)[1]

경고 : process.binding은 nodejs 코어 외부에서 사용해서는 안되며 nodejs 코어 팀은 적극적으로 사용 중단하려고합니다.

https://github.com/nodejs/node/pull/22004 https://github.com/nodejs/node/issues/22064


1

이 예제는 설명이 필요합니다. Await가 결과를 기다리는 방법을 확인하여 약속이 반환되지 않습니다.

cryA = crypto.subtle.generateKey({name:'ECDH', namedCurve:'P-384'}, true, ["deriveKey", "deriveBits"])
Promise {<pending>}
cryB = await crypto.subtle.generateKey({name:'ECDH', namedCurve:'P-384'}, true, ["deriveKey", "deriveBits"])
{publicKey: CryptoKey, privateKey: CryptoKey}

이것은 비동기 기능이어야합니다.
Samed

0
promiseA(pram).then(
     result => { 
     //make sure promiseA function allready success and response
     //do something here
}).catch(err => console.log(err)) => {
     // handle error with try catch
}

1
이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법이유 에 대한 추가 컨텍스트를 제공 하면 답변의 장기적인 가치가 향상됩니다.
Alexander

0

자바 스크립트에서 비동기 대기 메소드를 사용하여 쉽게 수행 할 수 있습니다.

아래는 시간 종료를 사용하여 WebRTC 약속 값을 검색하는 예입니다.

function await_getipv4(timeout = 1000) {
    var t1 = new Date();
    while(!window.ipv4) {
        var stop = new Date() - t1 >= timeout;
        if(stop) {
            console.error('timeout exceeded for await_getipv4.');
            return false;
        }
    }
    return window.ipv4;
}

function async_getipv4() {
    var ipv4 = null;
    var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}})
    findIP.then(ip => window.ipv4 = ip);
    return await_getipv4();
};


이 스 니펫을 여기가 아니라 실제 브라우저에서 실행하는 것이 중요합니다. 샌드 박스로 인한 것이라고 생각합니다.
OxFEEDFACE

0

Node REPL에서 약속의 가치 인 DB 연결을 얻으려면 다음 방법을 사용했습니다.

let connection
try {
  (async () => {
    connection = await returnsAPromiseResolvingToConnection()
  })()
} catch(err) {
  console.log(err)
}

라인 await은 일반적으로 약속을 반환합니다. 이 코드는 Node REPL에 붙여 넣을 수 있습니다.이 코드를 저장하면 index.js다음과 같이 Bash에서 실행할 수 있습니다.

node -i -e "$(< index.js)"

set 변수에 액세스하여 스크립트를 실행 한 후 Node REPL에 남아 있습니다. 비동기 함수가 리턴되었는지 확인하기 connection위해 예를 들어 로그 한 다음 변수를 사용할 수 있습니다. 물론 비동기 함수 외부의 스크립트에있는 코드에 대해서는 아직 해결중인 비동기 함수를 사용하고 싶지 않습니다.


0

위의 좋은 대답이 있으며 여기 ES6 화살표 기능 버전이 있습니다.

var something = async() => {
   let result = await functionThatReturnsPromiseA();
   return result + 1;
}

0

나는 자바 스크립트 약속을 느리게 학습합니다. 기본적으로 모든 비동기 함수는 약속을 반환합니다. 결과를 다음과 같이 줄 바꿈 할 수 있습니다.

(async () => {
//Optional "await"
  await yourAsyncFunctionOrPromise()
    .then(function (result) {
      return result +1;
    })
    .catch(function (error) {
      return error;
    })()
})

" await 표현식은 약속이 완료 될 때까지 (즉, 이행 또는 거부 될 때까지 비동기 기능 실행이 일시 정지되고, 이행 후 비동기 기능의 실행을 재개합니다. 재개 될 때, 대기 표현식의 값은 이행 된 약속의 값입니다. Promise가 거부되면 Await 식은 거부 된 값을 throw합니다 . "

더에 대한 읽기 await를 하고 약속을 에서 MDN 웹 문서


-5

이 작은 Typescript 코드 예제가 도움이 될 것입니다.

private getAccount(id: Id) : Account {
    let account = Account.empty();
    this.repository.get(id)
        .then(res => account = res)
        .catch(e => Notices.results(e));
    return account;
}

여기서는를 repository.get(id)반환합니다 Promise<Account>. 명령문 account내 변수에 지정합니다 then.


1
약속을 해결할 수 있기 전에 코드가 계정을 반환하는 것이므로 투표가 중단 된 것이므로 코드는 항상 Account.empty ()를 반환합니다.
Felype
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.