面接でよく聞かれるコードに関する質問
function increment(value) {
return value + 1;
}
function doubleUp(value) {
return value * 2;
}
function output(value) {
console.log(value);// => (1 + 1) * 2
}
var p = Promise.resolve(1);
p.then(increment)
.then(doubleUp)
.then(output)
分析します:
1. まず、p の状態は、解決 値が1であることです。
2. pの状態はresolveなので、increment関数を実行すると、incrementの値は1になります。
戻り値は2なので、increment のステータスはsolveなので、引き続き doubleUp 関数を実行します。
3. 類推すると、最終出力は4になります。
面接でよくあるコードの穴埋め質問
function sleep(time){
// 请写出你的代码
}
sleep(2000).then(()=>{
console.log("后续操作")
})
console.log(2);
効果: 最初に出力2 を実行し、2 秒待ってから「後続の操作」を出力します。
分析します:
2 秒後に出力するには、タイマーを 1 回だけ出力する必要があるため、setTimeoutを使用します
出力は then にあるため、スリープ状態を解決する必要があります
実装コード
function sleep(time){
return new Promise(function(resolve,reject){
// 异步操作,根据执行结果,决定是否调用 resolve,reject
setTimeout(function(){
resolve()
}, time)
})
}
Promiseの戻り値の状態を判断する方法
function do1() {
console.log("任务1");
}
function do2() {
console.log("任务2");
}
var p = new Promise((resolve,reject)=>{ resolve()})
p.then(do1)
.catch(do2)
var p1 = p.then(do1)
var p2 = p1.then(do2)
出力結果:タスク1
ステップ 1: p の状態が解決されるため、p.then(do1) で do1 関数が実行されます。出力任务1
p1 の状態は do1() によって決定されます。do1 は戻り値を明示的に指定していないため、戻り値は不定です。
ステータスは解決済みです。
ステップ 2: 次に、p2 を見てください。p1 の状態は解決されているため、do2 は実行されません。p2 の状態は変化しておらず、そのままです。
p1: 解決済みのステータスを維持します。
要約する
1. p1 のステータスが保留中の場合、p2 のステータスも保留中になります。
2. p1 の状態が解決されると、then() によって do2 が実行され、p2 の状態は do2 の戻り値によって決定されます。
2.1 do2 の戻り値が Promise オブジェクトでない場合、p2 の状態は解決され、p2 の PromiseValue は do2 関数になります
戻り値
2.2 do2 の戻り値が Promise オブジェクトの場合、p2 の状態と PromiseValue は Promise オブジェクトに基づきます
2.3 f_ok 関数内でエラーが発生した場合 (またはユーザーが積極的にエラーをスローした場合)、p2 のステータスは拒否され、p2
PromiseValue はこのエラー オブジェクトです
拒否された場合は解決された場合と一致するため、詳細には触れません
上記のことが理解できない場合は、次の個人的な理解を参照してください。
実行関数に return がある場合、値は return によって返された値になります。
実行関数が戻らない場合、値は未定義を返します。
どちらの場合も、関数のステータスは解決されます。
では、何が拒否されるのでしょうか?
エラーがあるか、関数が拒否状態に設定されている場合、その関数は拒否されます。それ以外の場合、拒否されません。