약속의 가치에 접근하려면 어떻게 해야 하나요?
의 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
, , a a not . 、Number
그렇다면, "그 가치는 약속 A가 1씩 증가하는 결과가 된다"는 것은 어떤 의미일까요?
는 가가거 that that that that that로 요?promiseB.value
+ 1을 반환하려면 해야 합니까?성공 콜백이 약속을 반환하고 "결과 + 1"을 반환하려면 어떻게 해야 합니까?뭔가를 놓치고 있다.
promiseA
의 »then
는 새로운 합니다( 반환promiseB
)됩니다.promiseA
입니다.그 값은 다음 중 성공함수에서 반환되는 값입니다.promiseA
.
경우, 「 」promiseA
됩니다.result
바로 해결이 됩니다.promiseB
「」의 을 사용해 .result + 1
.
「」의 값에의 promiseB
는, 우리가 한 .promiseA
.
promiseB.then(function(result) {
// here you can use the result of promiseB
});
ECMAScript 2016(ES7, 2016) 현재,async
/await
는 JavaScript의 표준으로, 상기의 어프로치를 대체하는 구문을 사용할 수 있습니다.이제 다음을 쓸 수 있습니다.
let result = await functionThatReturnsPromiseA();
result = result + 1;
약속B는 를 from는B로 입니다.await
직접 작업할 수 있습니다.
★★★★★★★★★★★★★★.await
async
능능. 조금같이 해야 합니다.따라서 약간 축소하려면 위의 내용을 다음과 같이 포함해야 합니다.
async function doSomething() {
let result = await functionThatReturnsPromiseA();
return result + 1;
}
알기 쉽게 하기 , 「」를 참조해 주세요.doSomething
비동기 함수는 약속을 반환하기 때문에 이 예에서는 여전히 약속입니다. 그 하려면 '접근하다'를 해야 .result = await doSomething()
이는 다른 비동기 함수 내에서만 수행할 수 있습니다.기본적으로 부모 비동기 컨텍스트에서만 자녀 비동기 컨텍스트에서 생성된 값에 직접 액세스할 수 있습니다.
약속이 해결/거부되면 성공/오류 핸들러를 호출합니다.
var promiseB = promiseA.then(function(result) {
// do something with result
});
then
method는 약속도 반환합니다.약속B는 약속A로부터의 성공/오류 핸들러로부터의 반환값에 따라 해결/거부됩니다.
세 가지 가능한 가치관이 있습니다.A의 성공/오류 핸들러는 약속B의 결과에 영향을 주는 다음 사항을 반환할 수 있습니다.
- 아무것도 반환하지 않음 → PromiseB는 즉시 해결되며 정의되지 않은 것은 PromiseB의 성공 핸들러로 전달됩니다.
- 값 반환 → PromiseB가 즉시 해결되고 값이 PromiseB의 성공 핸들러로 전달됩니다.
- 약속 반환 → 해결되면 약속B가 해결됩니다.거부되면 약속 B는 거부됩니다.약속 B의 핸들러에 전달된 값은 약속의 결과가 됩니다.
이를 이해하면 다음 사항을 이해할 수 있습니다.
promiseB = promiseA.then(function(result) {
return result + 1;
});
그러면 콜은 즉시 약속B를 반환합니다.
약속 A가 해결되면 그 결과를 약속으로 전달합니다.A의 성공 핸들러.
반품가치는 약속이기 때문에A의 결과 + 1, 성공 핸들러가 값(위의 옵션 2)을 반환하고 있으므로 약속 B는 즉시 해결되며 약속 B의 성공 핸들러는 약속에 전달됩니다.A의 결과 + 1
pixelbits의 답은 정확합니다.그리고 당신은 항상.then()
제품 코드에서 약속의 가치에 액세스합니다.
단, 다음과 같은 지원되지 않는 내부 Node.js 바인딩을 사용하여 해결된 후 약속 값에 직접 액세스할 수 있는 방법이 있습니다.
process.binding('util').getPromiseDetails(myPromise)[1]
경고: 프로세스.바인딩은 Node.js 코어 외부에서 사용하는 것이 아니므로 Node.js 코어 팀은 적극적으로 바인딩을 폐지하려고 합니다.
.then
합니다..then
A 수 、 A 수 、 A 수 。
로 사용할 수 .이 번호는 다음 주소로 이용하실 수 있습니다.number
promiseB의 성공 함수의 파라미터.그러면 1씩 증가합니다.
코멘트를 현재 이해하고 있는 것과는 조금 다른 해석으로 해석하면 다음과 같은 이점이 있습니다.
// 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
된 값은 해결된 입니다.promiseB
값 success Callback 값으로 됩니다.
promiseB.then(function (val) {
// val is now promiseA's result + 1
});
이전 몇 가지 좋은 답변이 있습니다. ES6 화살표 기능 버전은 다음과 같습니다.
var something = async() => {
let result = await functionThatReturnsPromiseA();
return result + 1;
}
실제로 인터랙티브(Node.js) 프롬프트에서는 "기다리기"만 하면 됩니다.
> y = new Promise((resolve, reject) => resolve(23));
Promise {
23,
[Symbol(async_id_symbol)]: 10419,
[Symbol(trigger_async_id_symbol)]: 5,
[Symbol(destroyed)]: { destroyed: false }
}
> v = await y;
23
이것은 REP에서 실험할 때 유용합니다.
"일반" 함수에서는 이 작업을 수행할 수 없습니다.
> function foo() { let z = await y; return z; }
Uncaught SyntaxError:
Unexpected token 'y'
"비동기 함수"에서 이를 수행할 수 있지만, 원하는 값이 아닌 약속을 지킬 수 있습니다.
> async function foo() { let z = await y; return z; }
undefined
> foo()
Promise {
<pending>,
[Symbol(async_id_symbol)]: 10571,
[Symbol(trigger_async_id_symbol)]: 5,
[Symbol(destroyed)]: { destroyed: false }
}
Node.js REP에서는 약속의 값인 데이터베이스 접속을 확립하기 위해 다음과 같은 방법을 사용했습니다.
let connection
try {
(async () => {
connection = await returnsAPromiseResolvingToConnection()
})()
} catch(err) {
console.log(err)
}
행await
보통 약속에 답하는 법이죠이 코드는 Node.js REP에 붙여넣거나 index.js에 저장할 경우 붙여넣을 수 있습니다.를 사용하여 Bash에서 실행할 수 있습니다.
node -i -e "$(< index.js)"
그러면 설정 변수에 대한 액세스 권한이 있는 스크립트를 실행한 후 Node.js REP가 됩니다.하려면 , 「비동기 함수」를 합니다.connection
예를 들어 변수를 사용할 준비가 되었습니다.물론 스크립트 내의 비동기 함수 외부의 코드에 대해 아직 비동기 함수가 해결되기를 기대하지는 않을 것입니다.
저는 JavaScript의 약속을 늦게 배웁니다.기본적으로는 모든 비동기 함수는 약속을 반환하며 다음과 같이 결과를 정리할 수 있습니다.
(async () => {
//Optional "await"
await yourAsyncFunctionOrPromise()
.then(function (result) {
return result +1;
})
.catch(function (error) {
return error;
})()
})
wait 표현에 의해 Promise가 정착될 때까지(즉, 이행 또는 거부) 비동기 함수의 실행이 일시 중지되고 실행 후 비동기 함수의 실행이 재개됩니다.재개되었을 때, 기다림의 가치는 이행된 약속의 가치입니다.
Promise가 거부되면 wait 표현은 거부된 값을 슬로우합니다.
대기 및 약속에 대한 자세한 내용은 MDN Web 매뉴얼을 참조하십시오.
대화형 프롬프트에서 실험할 때 "then()" 함수의 글로벌 변수에 값을 할당함으로써 Promise의 값에 액세스할 수 있습니다. 예를 들어 다음과 같습니다.
> promise = new Promise((resolve, reject) => resolve(17));
Promise {
17,
[Symbol(async_id_symbol)]: 7600,
[Symbol(trigger_async_id_symbol)]: 5,
[Symbol(destroyed)]: { destroyed: false }
}
> global_cheat = null;
null
> promise.then((v) => { global_cheat = v; } );
Promise {
<pending>,
[Symbol(async_id_symbol)]: 7875,
[Symbol(trigger_async_id_symbol)]: 7600,
[Symbol(destroyed)]: { destroyed: false }
}
> global_cheat
17
코드에서는 항상 "follow up" 코드를 "then()" 부분에 삽입하도록 강제하는 것이 목적인 것 같습니다(또는 이해하면 비동기/대기 패턴에 삽입하고, 이해하면 "then()" 패턴으로 다시 씁니다).동기적으로 가치를 얻기 위한 백도어를 제공하지 않는 것은 언어 디자이너의 지나친 온정주의로 보이지만, 이것이 시스템을 "차단"하는 것을 막는 것이라고 생각합니다.
대화형 명령줄에서 다시 한 번 주의해 주십시오.
> xyz=null; promise.then((v) => {xyz = v;}); console.log(`xyz=${xyz}`);
xyz=null
이는 "then()" 내의 코드가 아직 실행되지 않았기 때문입니다.
단, (인터랙티브프롬프트에서) "다음 행"에서는 다음을 수행할 수 있습니다.
> xyz
17
MDN 문서는 이 문제를 해결하는 데 도움이 되었습니다.
let promiseB = promiseA;
promiseB.then((value) => {
console.log(value);
});
JSON 오브젝트의 여러 레벨을 다운할 필요가 있는 경우:
let promiseB = promiseA;
promiseB.then((value) => {
console.log(value?.key1.key2);
});
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
}
이 예에서 나는 스스로 설명할 수 있다고 생각합니다.결과를 기다리기 때문에 반환되는 약속을 놓치게 됩니다.
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}
이는 JavaScript의 비동기 대기 방식을 사용하여 쉽게 수행할 수 있습니다.
다음으로 타임아웃을 사용하여 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();
};
언급URL : https://stackoverflow.com/questions/29516390/how-can-i-access-the-value-of-a-promise
'source' 카테고리의 다른 글
Maven - Eclipse에서 관리 버전 재정의 경고 억제 (0) | 2023.02.26 |
---|---|
AngularJS 왜 스코프가 필요하죠?$140 이내.$on? (0) | 2023.02.26 |
$resource에 전달된 @id란 무엇입니까? (0) | 2023.02.26 |
echo woocommerce 특정 제품 ID 재고 수량 (0) | 2023.02.26 |
리액트 컴포넌트 내보내기가 작동하지 않는 이유는 무엇입니까? (0) | 2023.02.26 |