Una pregunta clave que se hace con frecuencia en las entrevistas
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)
analizar:
1. Primero, el estado de p es que el valor de resolución es 1
2. Debido a que el estado de p es resuelto, ejecute la función de incremento y el valor de incremento es 1
El valor devuelto es 2 , por lo que el estado del incremento es resolver , así que continúe ejecutando la función doubleUp
3. Por analogía, la salida final es 4
Código común de preguntas para completar espacios en blanco en las entrevistas
function sleep(time){
// 请写出你的代码
}
sleep(2000).then(()=>{
console.log("后续操作")
})
console.log(2);
Efecto: primero ejecute la salida 2 y espere dos segundos antes de generar la " operación posterior "
analizar:
La salida después de dos segundos requiere un temporizador para emitir solo una vez, así que use setTimeout
La salida está en ese momento, por lo que el estado de suspensión debe resolverse.
Código de implementación
function sleep(time){
return new Promise(function(resolve,reject){
// 异步操作,根据执行结果,决定是否调用 resolve,reject
setTimeout(function(){
resolve()
}, time)
})
}
Cómo juzgar el estado del valor de retorno de la promesa
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)
Resultado de salida: Tarea 1
Paso 1: Como se resuelve el estado de p, en p.then(do1), se ejecutará la función do1. producción任务1
El estado de p1 está determinado por do1(). Debido a que do1 no especifica explícitamente el valor devuelto, el valor devuelto no está definido.
El estado está resuelto.
Paso 2: A continuación, mira p2. Dado que el estado de p1 está resuelto, no ejecutará do2, el estado de p2 no ha cambiado y todavía está
Mantener el estado de p1: resuelto.
Resumir
1. Si el estado de p1 está pendiente, entonces el estado de p2 también está pendiente
2. Si se resuelve el estado de p1, entonces () ejecutará do2, luego el estado de p2 se determina por el valor de retorno de do2
2.1 Si el valor de retorno de do2 no es un objeto de promesa, el estado de p2 se resuelve y el valor de promesa de p2 es la función do2
valor devuelto
2.2 Si el valor de retorno de do2 es un objeto de promesa, entonces el estado de p2 y el valor de promesa se basan en el objeto de promesa
2.3 Si ocurre un error dentro de la función f_ok (o el usuario lanza activamente un error), el estado de p2 es rechazado y p2
ElpromiseValue es este objeto de error
Rechazado es consistente con resuelto y no entraré en detalles
Si no entiende lo anterior, puede consultar el siguiente entendimiento personal:
Si la función de ejecución tiene retorno, el valor es el valor devuelto por retorno
Si la función de ejecución no regresa, el valor devuelve un indefinido
En ambos casos se resuelve el estado de la función
Entonces, ¿qué se rechaza?
Si hay un error o la función se establece en el estado rechazado, se rechazará; de lo contrario, no se rechazará.