阿里前端测试题--关于ES6中Promise函数的理解与应用
今天做了阿里前端的笔试题目,原题目是这样的
//实现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;
});const mergePromise = ajaxArray => {
// 在这里实现你的代码};
mergePromise([ajax1, ajax2, ajax3]).then(data => {
console.log('done');
console.log(data); // data 为 [1, 2, 3]
});// 分别输出
// 1
// 2
// 3
// done
// [1, 2, 3]
从网上找到的答案我写贴上:
var data = [];
var sequence = Promise.resolve();
ajaxArray.forEach(function(item){
sequence = sequence.then(item).then(function(res){
data.push(res);
return data;
});
})return sequence;
解答思路和原理有空再研究贴上来。
更新--思路解析:
首先理解一下javascript的执行机制--异步执行,也就是说两个并列函数的执行顺序不会先执行完第一个,再执行后一个。举个栗子:
func A(){
setTimeout(function(){
console.log('a');
},3000);
}
func B(){
setTimeout(function(){
console.log('b');
},1000);
}
A();
B();
那么你觉得输出结果是啥?不妨试下,会输出b,a.
原因就是异步执行。当执行到A函数时,会注册一个三秒后执行的函数,直接去执行B,而不是等三秒执行完A再去执行B。
promise可以实现同步执行
先说一下使用方法吧:promise和then配合使用,类似于回调函数,执行完promise之后才会执行then的内容
new Promise((resolve, reject) {
}).then(function(){
}).then(function(){})...
promise里面的两个参数表示promise的执行状态
但是值得注意的是then里面的东西可不是同步执行,并不是前一个执行完再执行后一个,then之间还是遵循异步原则的。
所以JavaScript、nodejs想要实现同步,各路神仙都有自己不同的理解和套路。
后续更新。
最新文章
- JS鼠标事件大全 推荐收藏
- jquery的css详解(二)
- MathType 6.9 介绍安装
- 【荐】PHP上传文件大小限制大全
- MySQL 数据库双向镜像、循环镜像(复制)
- ha456.jar打开dump文件报Unsupported major.minor version 51.0异常
- MySQL数据库初识(二)
- Loadrunner关联
- 函数buf_page_init_for_read
- vg
- Salesforce开发者学习笔记之二:Salesforce开发平台应用场景
- java内存模型3
- 初学 Python(十三)——匿名函数
- Numpy入门 - 生成数组
- Python爬虫! 单爬,批量爬,这都不是事!
- php递归实现一维数组转为指定树状结构 --- 省市区处理
- Java后台使用Websocket教程
- jq里验证插件的自定义方法Jquery.validator.addMethod()示例
- H3路由器映射端口到外网
- linux 下tftpf搭建