お約束の面接質問と戻り値の状態判断

面接でよく聞かれるコードに関する質問

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 秒後に出力するには、タイマーを 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 によって返された値になります。

        実行関数が戻らない場合、値は未定義を返します。

どちらの場合も、関数のステータスは解決されます。

では、何が拒否されるのでしょうか?

        エラーがあるか、関数が拒否状態に設定されている場合、その関数は拒否されます。それ以外の場合、拒否されません。

おすすめ

転載: blog.csdn.net/swoly2894265391/article/details/124546938