【study】promise面试遇到的问题

78 阅读3分钟
  1. 补全代码
function test() {
  const a = Math.random() * 32;
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (a < 16) {
        resolve(a);
      } else {
        reject(a);
      }
    }, 1000); // 假设操作需要1秒
  });
}

function test1(fn, time) {
 // 补全代码
  return new Promise((resolve, reject) => {
    let attempts = 0;

    const tryFn = () => {
      attempts++;
      fn().then(resolve).catch(error => {
        if (attempts >= time) {
          reject(error);
        } else {
          tryFn();
        }
      });
    };

    tryFn();
  });
}

test1(test, 3)
  .then((result) => {
    console.log('成功:', result);
  })
  .catch((error) => {
    console.log('失败:', error);
  });

  1. 封装一个请求会返回一个promise
// 获取id列表
export async function getIdList(a, b) {
    const params = {
        touchWays: [a],
        channels: ['919'],
        status: b,
    };

    try {
        const result = await Service.getSearch(params); // 模拟请求接口
        return result.data || [];
    } catch (err) {
        console.log(err);
    }
}

 // 获取新建id数组
    const loadIdList = async () => {
       getIdList(a, b).then((list) => {
                idList= list.map(item => ({
                    label: `${item.id}-${item.name}`,
                    value: item.id,
                }));
            }).catch((err) => {
                console.log(err)
            });
        };

  1. 补全代码:基础 Promise 使用
const promise = new Promise((resolve, reject) => {
  // 补全代码
});

promise.then((result) => {
  console.log(result);
}).catch((error) => {
  console.log(error);
});
const promise = new Promise((resolve, reject) => {
  const success = true; // 或者 false,根据需要

  if (success) {
    resolve("成功");
  } else {
    reject("失败");
  }
});

promise.then((result) => {
  console.log(result); // 输出: 成功
}).catch((error) => {
  console.log(error);
});

  1. 补全代码:链式调用
const firstPromise = new Promise((resolve, reject) => {
  // 补全代码
});

firstPromise
  .then((result) => {
    console.log(result); // 输出: Step 1
    return "Step 2";
  })
  .then((result) => {
    console.log(result); // 输出: Step 2
    return "Step 3";
  })
  .then((result) => {
    console.log(result); // 输出: Step 3
    // 补全代码,使得在最后一个输出后再输出 'Done'
    return 'Done';
  })
  .then((result) => {
    console.log(result); // 输出: Done
  });
const firstPromise = new Promise((resolve, reject) => {
  resolve("Step 1");
});

firstPromise
  .then((result) => {
    console.log(result); // 输出: Step 1
    return "Step 2";
  })
  .then((result) => {
    console.log(result); // 输出: Step 2
    return "Step 3";
  })
  .then((result) => {
    console.log(result); // 输出: Step 3
    return 'Done';
  })
  .then((result) => {
    console.log(result); // 输出: Done
  });

  1. 补全代码:错误处理
const faultyPromise = new Promise((resolve, reject) => {
  // 补全代码
});

faultyPromise
  .then((result) => {
    console.log(result);
  })
  .catch((error) => {
    console.error(error); // 应该捕获并输出错误
  });
const faultyPromise = new Promise((resolve, reject) => {
  const success = false; // 或者 true,根据需要

  if (success) {
    resolve("成功的结果");
  } else {
    reject("出错了");
  }
});

faultyPromise
  .then((result) => {
    console.log(result);
  })
  .catch((error) => {
    console.error(error); // 输出: 出错了
  });

6.补全代码: Promise.all

const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => resolve("结果1"), 1000);
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => resolve("结果2"), 1500);
});

const promise3 = new Promise((resolve, reject) => {
  setTimeout(() => reject("错误"), 2000);
});

// 使用 Promise.all 处理 promise1, promise2 和 promise3
// 补全代码
const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => resolve("结果1"), 1000);
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => resolve("结果2"), 1500);
});

const promise3 = new Promise((resolve, reject) => {
  setTimeout(() => reject("错误"), 2000);
});

Promise.all([promise1, promise2, promise3])
  .then((results) => {
    console.log(results); // 不会被执行
  })
  .catch((err) => {
    console.error(err); // 输出: 错误
  });

7.补全代码: Promise.race

const fastPromise = new Promise((resolve, reject) => {
  setTimeout(() => resolve("快的结果"), 1000);
});

const slowPromise = new Promise((resolve, reject) => {
  setTimeout(() => resolve("慢的结果"), 2000);
});

// 使用 Promise.race 处理 fastPromise 和 slowPromise
// 补全代码
const fastPromise = new Promise((resolve, reject) => {
  setTimeout(() => resolve("快的结果"), 1000);
});

const slowPromise = new Promise((resolve, reject) => {
  setTimeout(() => resolve("慢的结果"), 2000);
});

Promise.race([fastPromise, slowPromise])
  .then((result) => {
    console.log(result); // 输出: 快的结果
  })
  .catch((err) => {
    console.error(err);
  });
  1. 实现一个函数 customPromiseAll,它的功能与 Promise.all 类似。
function customPromiseAll(promises) {
  // 补全代码
}

// 测试代码:
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

customPromiseAll([promise1, promise2, promise3]).then((values) => {
  console.log(values); // [3, 42, 'foo']
});
function customPromiseAll(promises) {
  return new Promise((resolve, reject) => {
    let results = [];
    let completedPromises = 0;

    promises.forEach((promise, index) => {
      Promise.resolve(promise)
        .then((value) => {
          results[index] = value;
          completedPromises += 1;
          if (completedPromises === promises.length) {
            resolve(results);
          }
        })
        .catch((error) => {
          reject(error);
        });
    });
  });
}

// 测试代码:
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

customPromiseAll([promise1, promise2, promise3]).then((values) => {
  console.log(values); // [3, 42, 'foo']
});

  1. 使用Promise实现每隔1秒输出1,2,3?
const arr = [1, 2, 3];

// delay 函数,返回一个 Promise,对应的延迟时间(ms)后解决
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// 通过链式调用 delay 函数来实现每隔 1 秒输出一个数字
function printArrayElements(array) {
  let promise = Promise.resolve();

  array.forEach((item) => {
    promise = promise.then(() => {
      console.log(item);
      return delay(1000);
    });
  });

  promise.finally(() => {
    console.log("完成所有输出");
  });
}

printArrayElements(arr);

// 有一个红绿灯,红灯3秒亮一次,绿灯2秒亮一次,黄灯1秒亮一次,怎么让其规律的亮下去
// 等待指定毫秒数的Promise函数
function wait(ms) {
  return new Promise(resolve => {
    setTimeout(resolve, ms);
  });
}

// 模拟红绿灯亮灯的函数
  async function trafficLight() {
    while (true) { // 无限循环
      console.log("红灯亮");
      await wait(3000); // 红灯亮3秒
      
      console.log("黄灯亮");
      await wait(1000); // 黄灯亮1秒
      
      console.log("绿灯亮");
      await wait(2000); // 绿灯亮2秒
    }
  }

// 启动红绿灯
trafficLight().catch(error => {
  console.error("发生错误:", error);
});