私は$q
のAngularのドキュメントからこの例を見ていますが、これはおそらく一般的な約束に当てはまると思います。彼らはこの例を持っていて、彼らのコメントを含んで逐語的にコピーされました:
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
型のpromiseオブジェクトです。これはNumber
ではありません。それでは、「その値はpromiseAを1つ増やした結果になるでしょう」とはどういう意味ですか。
私はそれをpromiseB.value
またはそのようなものとしてアクセスするはずですか?成功コールバックが約束を返して "result + 1"を返すにはどうすればいいですか?私は何かが足りない。
promiseA
のthen
関数は、promiseB
が解決された直後に解決される新しいpromise(promiseA
)を返します。その値は、promiseA
内のsuccess関数から返される値です。
この場合、promiseA
は値result
で解決され、すぐにresult + 1
の値でpromiseB
が解決されます。
promiseB
の値へのアクセスは、promiseA
の結果にアクセスしたのと同じ方法で行われます。
promiseB.then(function(result) {
// here you can use the result of promiseB
});
約束が解決または却下されると、成功/エラーハンドラが呼び出されます。
var promiseB = promiseA.then(function(result) {
// do something with result
});
then
メソッドは、promise:promiseBも返します。これは解決されます/拒否されますpromiseAからの成功/エラーハンドラからの戻り値による。
PromiseAの成功/エラーハンドラが返すことができる、promiseBの結果に影響を与える3つの可能な値があります。
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;
});
その後、呼び出しはすぐにpromiseBを返します。 promiseAが解決されると、それはpromiseAの成功ハンドラに結果を渡します。戻り値はpromiseAのresult + 1なので、成功ハンドラは値を返しているので(上記のオプション2)、promiseBは直ちに解決され、promiseBの成功ハンドラはpromiseAのresult + 1を渡されます。
promiseBの.then
関数は、promiseAの.then
関数から返されるものを受け取ります。
ここでは、promiseAが返す数値が返されます。これは、promiseBの成功関数のnumber
パラメータとして使用できます。それから1ずつ増加します。
現在の理解とは少し違った方法でコメントを解析すると役立つ場合があります。
// promiseB will be resolved immediately after promiseA is resolved
これはpromiseB
は約束されていますが、promiseA
が解決された直後に解決されると述べています。別の見方をすると、promiseA.then()
はpromiseB
に割り当てられたpromiseを返します。
// and its value will be the result of promiseA incremented by 1
これは、promiseA
が解決した値が、promiseB
がsuccessCallback値として受け取る値であることを意味します。
promiseB.then(function (val) {
// val is now promiseA's result + 1
});
あなたは簡単に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();
};
Node REPLで、約束の価値であるDB接続を取得するために、次のアプローチを取りました。
let connection
try {
(async () => {
connection = await returnsAPromiseResolvingToConnection()
})()
} catch(err) {
console.log(err)
}
await
を含む行は通常、promiseを返します。このコードはNode REPLに貼り付けるか、index.js
に保存した場合、Bashで実行できます。
node -i -e "$(< index.js)"
設定変数にアクセスしてスクリプトを実行すると、Node REPLのままになります。非同期関数が返されたことを確認するには、たとえばconnection
をログに記録して、変数を使用する準備ができます。もちろん、非同期関数以外のスクリプト内のコードについては、非同期関数がまだ解決されていることを期待したくないでしょう。
pixelbitsの答えは正しいので、プロダクションコードのpromiseの値にアクセスするには.then()
を常に使うべきです。
ただし、次のサポートされていない内部node.jsバインディングを使用して解決された直後にプロミスの値にアクセスする方法があります。
process.binding('util').getPromiseDetails(myPromise)[1]
警告:process.bindingはnodejsコアの外部で使用されることを決して意図されておらず、nodejsコアチームは積極的にそれを非推奨にしようとしています
https://github.com/nodejs/node/pull/22004https://github.com/ nodejs/node/issues/22064
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}