web-dev-qa-db-ja.com

約束の価値にアクセスするにはどうすればいいですか?

私は$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()を呼び出すことができ、それらを連鎖させることができれば、promiseBObject型のpromiseオブジェクトです。これはNumberではありません。それでは、「その値はpromiseAを1つ増やした結果になるでしょう」とはどういう意味ですか。

私はそれをpromiseB.valueまたはそのようなものとしてアクセスするはずですか?成功コールバックが約束を返して "result + 1"を返すにはどうすればいいですか?私は何かが足りない。

100

promiseAthen関数は、promiseBが解決された直後に解決される新しいpromise(promiseA)を返します。その値は、promiseA内のsuccess関数から返される値です。

この場合、promiseAは値resultで解決され、すぐにresult + 1の値でpromiseBが解決されます。

promiseBの値へのアクセスは、promiseAの結果にアクセスしたのと同じ方法で行われます。

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

約束が解決または却下されると、成功/エラーハンドラが呼び出されます。

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を渡されます。

17
pixelbits

promiseBの.then関数は、promiseAの.then関数から返されるものを受け取ります。

ここでは、promiseAが返す数値が返されます。これは、promiseBの成功関数のnumberパラメータとして使用できます。それから1ずつ増加します。

2
harishr

現在の理解とは少し違った方法でコメントを解析すると役立つ場合があります。

// 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
});
2
Jason Cust

あなたは簡単に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();
};
0
OxFEEDFACE

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をログに記録して、変数を使用する準備ができます。もちろん、非同期関数以外のスクリプト内のコードについては、非同期関数がまだ解決されていることを期待したくないでしょう。

0
dmstack

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

0
Zeus Lalkaka
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
}
0
tomnyson

この例では、私は自明です。どのくらい待つのが結果を待っているのかに注目してください。そうすれば、約束が返されるのを見逃してしまいます。

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}
0
Master James