- 用Promise封装一个异步加载图片的方法
function loadImage (url) { return new Promise((resolve, reject) => { let image = new Image(); image.onload = () => { resolve(image); } image.onerror = () => { reject(new Error('图片加载失败,url:' + url)) } image.src= url; }) }
- 实现mergePromise函数,把传进去的数组按顺序先后执行,并且把返回的数据先后放到数组data中。
const timeout = ms => new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, ms); }); const ajax1 = () => timeout(2000).then(() => { console.log('1'); return 1; }); const ajax2 = () => timeout(1000).then(() => { console.log('2'); return 2; }); const ajax3 = () => timeout(2000).then(() => { console.log('3'); return 3; }); mergePromise([ajax1, ajax2, ajax3]).then(data => { console.log('done'); console.log(data); // data 为 [1, 2, 3] }); const mergePromise = ajaxArray => { // 在这里实现你的代码 };
解答:
顺序执行意味着链式调用,输出结果为收集结果的数组(使用promise,用data收集,结果resolve)const mergePromise = ajaxArray => { // 在这里实现你的代码 let promises = Promise.resolve() let data = [] ajaxArray.forEach(p => { promises = promises.then(p).then((res) => { data.push(res) return data }) }); return promises };
- 写一个函数实现arr的串行调用,让arr依次输出run1/run2/run3。必须按照arr的顺序执行,需要用Promise的状态去实现先后顺序(resolve或者reject函数执行状态改变后才能执行下一个)。
解答:let arr = [()=>{ return new Promise(res=>{ console.log("run1", Date.now()); res() }) },()=>{ return new Promise(res=>{ console.log("run2", Date.now()); res() }) },()=>{ return new Promise(res=>{ console.log("run3", Date.now()); res() }) }];
// 1. async function p(arr){ for(let v of arr){ await v(); } } //2. function p(arr){ le
promise 面试题(编程题)
于 2023-10-26 22:25:34 首次发布