2017-05-05 9 views
1

私はPromisesでスピードアップしていますが、理解できないことが1つあります。約定のための解決関数を定義できますか?

そこで、我々はそうのような約束を定義します。

new Promise(/* executor */ function(resolve, reject) { ... }); 

私はresolveは状況が正常に解決されたときに、私が呼び出す必要がある関数であるという印象の下にありました。だから私はこのような何かをしようとした:

function resolve(number) { 
    return number * 2; 
} 

var p = new Promise((resolve, reject) => { 
    setTimeout(() => resolve(5), 1000); 
}); 

p.then((doubledNumber) => { 
    console.log(doubledNumber); // expected: 10, actual: 5 
}); 

だから、resolveは通常の意味での関数ではありませんように、それはより多くのreturnのようなキーワードのようなものだそうです。言い換えれば、私がresolveと呼んでいるときに、私はresolveへのargとして私が提供する値を渡すようにプログラムに指示するだけです。

私の理解は正しいですか?

答えて

4

その理解はあまり正しくありません。定義したresolve関数は使用されていません。 resolve(5)を呼び出すと、代わりにPromiseコンストラクタによって引数として提供されているresolve関数を使用しています。 名前resolveには特別な意味がありません、この引数に任意の名前を使用できます。たとえば、代わりにresolverejectの我々はsetValuesetErrorそれらを呼び出すことができます。

var p = new Promise((setValue, setError) => { 
    setTimeout(() => setValue(5), 1000); 
}); 

それはresolveのローカル定義の影されたときresolveと呼ばれるあなたが定義した関数が使用されなかった理由をここで見ることができます。

Promiseコンストラクタによって与えられたresolve()関数は、Promiseに値を提供するためにのみ呼び出されます。

あなたが約束から生じた結果の値を変更したい場合、あなたは(あなたに修正された値を持つ新しい約束を与える).then(...)を使用して、フィルタリング機能を適用する必要があります。

function doubleResult(x) { 
    return x * 2; 
} 

var doubleP = p.then(doubleResult); 
doubleP.then((doubledNumber) => { 
    console.log(doubledNumber); 
}); 
+0

OK、について少しarg名でシャドーされている関数名は、私がクリックしたものです。だから、返された値を "処理"するには、関数r(val){return val * 2; } 'そして' setTimeout(()=>解決(r(5))、1000) 'のようなPromiseで呼び出します。 –

+0

@KayceBasquesうん、それはこれでもうまくいくだろう。 :) –

関連する問題