promise面试题及返回值状态判断

一个面试常问的代码题

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的状态是resolve 值是1

2.因为p的状态是resolve 因此执行increment函数,increment的value值是1

返回值是2 因此increment的状态是resolve 所以继续执行doubleUp函数

3.以此类推,最终输出结果为4

面试常见的代码填空题

function sleep(time){
    // 请写出你的代码
}

sleep(2000).then(()=>{
    console.log("后续操作")
})
console.log(2);

效果:先执行输出等两秒后输出"后续操作"

分析:

        两秒后输出  需要用到定时器  只输出一次  因此使用setTimeout

        输出在then里面  因此sleep的状态需要是resolve

实现代码

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

第一步:由于p的状态是resolved,所以p.then(do1)中,do1函数会执行。输出任务1

     p1的状态由do1()来决定。因为do1并没有明确指定返回值,则返回值就是undefined. p1

               的状态就是resolved。

第二步:接下来看p2。由于p1的状态是resolved,所以它并不会执行do2, p2的状态没有变化,仍

                保持p1的状态:resolved。

总结

1.如果p1的状态是pending,则p2的状态也是pending

2.如果p1的状态是resolved,then()会去执行do2,则p2的状态由do2的返回值决定

2.1如果do2返回值不是promise对象,则p2的状态是resolved,且p2的promiseValue就是do2函数

     的return值

2.2如果do2返回值是一个promise对象,则p2的状态及promiseValue以这个promise对象为准

2.3如果f_ok这个函数内部发生了错误(或者是用户主动抛出错误),则p2的状态是rejected,且p2

    的promiseValue就是这个错误对象

rejected与resolved一致我就不多赘述了

如果以上看不太懂了话可以参考以下个人理解:

        若执行函数有return 则值为return返回的值

        若执行函数没有return  则值返回一个undefined

两种情况 该函数的状态都为resolved

那什么情况为rejected呢?

        若出现错误  或者该函数设定为rejected 状态才会是rejected  其他情况都不是rejected

<think>好的,用户想查找与Promise相关的JavaScript异步编程面试题。首先,我需要回顾提供的引用内容,看看哪些相关。引用1提到了Promise的基本用法和async/await的简化写法,引用2有一个具体的Promise面试题例子,引用3解释了Promise的Resolved状态,引用4是关于重试Promise的实现,引用5讨论了回调地狱的问题。这些都是用户可能需要的知识点。 接下来,用户的需求是面试题,所以需要整理常见的Promise考点。比如事件循环、链式调用、错误处理、async/await、手写Promise方法等。根据引用中的例子,可以提取相关问题,比如事件循环的执行顺序、链式调用结果、async/await转换等。 还要注意用户可能需要的不仅是问题,还有解答,但用户明确要求生成相关问题,所以需要列举问题,并在必要时提供答案结构。比如引用2中的代码输出题,可以转化为问题,并提示涉及事件循环的知识点。 此外,引用4中的重试函数实现也是一个常见的面试题,可以设计成如何实现重试机制的问题。引用5中的回调地狱问题可以引出Promise如何解决嵌套的问题,或者比较Promise和回调的优缺点。 需要确保问题覆盖不同的难度层次,从基础到高级,比如从基本状态到手写Promise.all。同时,要参考用户提供的引用内容,尽量将已有的例子融入问题中,比如使用引用2的代码作为问题示例。 最后,检查是否符合格式要求,使用中文,正确使用LaTeX,独立公式用$$,行内用$。但当前问题生成部分不需要复杂公式,可能用到的比如链式调用中的返回值处理,可以用行内公式表示,例如每个.then()返回的新Promise等。不过可能问题中更多是代码示例,所以需要确保代码块正确使用反引号格式。 总结步骤:1. 整理引用中的Promise相关知识点;2. 转化为面试题形式;3. 覆盖基础到高级;4. 结合事件循环、链式调用、错误处理、async/await、手写方法等主题;5. 确保问题清晰,参考引用内容。</think>### JavaScript Promise 面试题解析 #### 1. Promise 基础概念 Promise 是处理异步操作的标准化方案,包含三种状态:`Pending`、`Resolved`(Fulfilled)、`Rejected`。以下代码的输出顺序是什么? ```javascript console.log('start'); const promise = new Promise((resolve) => { console.log('promise executor'); resolve('resolved'); }); promise.then(console.log); console.log('end'); ``` **答案**:`start → promise executor → end → resolved` **解析**:Promise 构造函数内的同步代码立即执行,`.then()` 回调进入微任务队列,在宏任务(如 `console.log('end')`)之后执行[^3]。 --- #### 2. 事件循环与执行顺序 分析以下代码的输出顺序(考察宏任务与微任务): ```javascript console.log('start'); setTimeout(() => console.log('timeout'), 0); Promise.resolve().then(() => console.log('promise')); console.log('end'); ``` **答案**:`start → end → promise → timeout` **解析**:微任务(如 Promise)优先于宏任务(如 `setTimeout`)执行[^2]。 --- #### 3. Promise 链式调用 以下代码的输出结果是什么? ```javascript Promise.resolve(1) .then((x) => x + 2) .then((x) => { throw new Error(x) }) .catch((e) => e.message) .then(console.log); ``` **答案**:输出 `3` **解析**:链式调用中,前一个 `.then()` 的返回值会传递给下一个 `.then()`,错误会被 `.catch()` 捕获后继续传递[^3]。 --- #### 4. async/await 简化写法 如何用 `async/await` 改写以下代码? ```javascript function fetchData() { return fetch(url) .then(response => response.json()) .catch(error => console.error(error)); } ``` **答案**: ```javascript async function fetchData() { try { const response = await fetch(url); return await response.json(); } catch (error) { console.error(error); } } ``` **关键点**:`async` 函数隐式返回 Promise,`await` 替代 `.then()`,`try/catch` 处理错误[^1]。 --- #### 5. 手写 Promise.all 实现一个简化的 `Promise.all`: ```javascript function promiseAll(promises) { return new Promise((resolve, reject) => { let results = []; let completed = 0; promises.forEach((promise, index) => { Promise.resolve(promise) .then((value) => { results[index] = value; completed++; if (completed === promises.length) resolve(results); }) .catch(reject); }); }); } ``` **考察点**:处理并发 Promise、结果顺序一致性、错误快速失败机制[^4]。 --- #### 6. 综合应用题 以下代码的输出顺序是什么? ```javascript console.log('start'); const p1 = new Promise((resolve) => { setTimeout(() => resolve('p1'), 1000); }); const p2 = Promise.resolve('p2'); p1.then(console.log); p2.then(console.log); setTimeout(() => console.log('timeout'), 0); console.log('end'); ``` **答案**:`start → end → p2 → timeout → p1` **解析**:`p2` 是立即解决的微任务,`timeout` 是宏任务,`p1` 因延迟 1 秒最后输出[^2][^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值