Une question codée fréquemment posée dans les entretiens
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)
analyser:
1. Premièrement, l'état de p est que la valeur de résolution est 1
2. Parce que l'état de p est résolu, exécutez la fonction d'incrémentation et la valeur d'incrémentation est 1
La valeur de retour est 2 , donc le statut de l'incrément est resolve , donc continuez à exécuter la fonction doubleUp
3. Par analogie, la sortie finale est 4
Questions courantes à remplir en blanc dans les entretiens
function sleep(time){
// 请写出你的代码
}
sleep(2000).then(()=>{
console.log("后续操作")
})
console.log(2);
Effet : exécutez d'abord la sortie 2 et attendez deux secondes avant de sortir " opération suivante "
analyser:
La sortie après deux secondes nécessite une minuterie pour sortir une seule fois, utilisez donc setTimeout
La sortie est alors, donc l'état de veille doit être résolu
Code d'implémentation
function sleep(time){
return new Promise(function(resolve,reject){
// 异步操作,根据执行结果,决定是否调用 resolve,reject
setTimeout(function(){
resolve()
}, time)
})
}
Comment juger de l'état de la valeur de retour de la promesse
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)
Résultat de sortie : Tâche 1
Étape 1 : Puisque l'état de p est résolu, dans p.then(do1), la fonction do1 sera exécutée. sortir任务1
L'état de p1 est déterminé par do1(). Étant donné que do1 ne spécifie pas explicitement la valeur de retour, la valeur de retour n'est pas définie.
Le statut est résolu.
Étape 2 : Ensuite, regardez p2. Puisque l'état de p1 est résolu, il n'exécutera pas do2, l'état de p2 n'a pas changé et il est toujours
Conserver l'état de p1 : résolu.
Résumer
1. Si l'état de p1 est en attente, l'état de p2 est également en attente
2. Si l'état de p1 est résolu, then() exécutera do2, alors l'état de p2 est déterminé par la valeur de retour de do2
2.1 Si la valeur de retour de do2 n'est pas un objet de promesse, l'état de p2 est résolu et la valeur de promesse de p2 est la fonction do2
valeur de retour
2.2 Si la valeur de retour de do2 est un objet de promesse, alors l'état de p2 et le promiseValue sont basés sur l'objet de promesse
2.3 Si une erreur se produit dans la fonction f_ok (ou si l'utilisateur génère activement une erreur), le statut de p2 est rejeté et p2
La promiseValue est cet objet d'erreur
Rejeté correspond à résolu et je n'entrerai pas dans les détails
Si vous ne comprenez pas ce qui précède, vous pouvez vous référer à la compréhension personnelle suivante :
Si la fonction d'exécution a return, la valeur est la valeur retournée par return
Si la fonction d'exécution ne retourne pas, la valeur retourne un indéfini
Dans les deux cas, le statut de la fonction est résolu
Alors qu'est-ce qui est rejeté ?
S'il y a une erreur ou si la fonction est définie sur l'état rejeté, elle sera rejetée, sinon elle ne sera pas rejetée