今天做了阿里前端的笔试题目,原题目是这样的

//实现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想要实现同步,各路神仙都有自己不同的理解和套路。

后续更新。

最新文章

  1. JS鼠标事件大全 推荐收藏
  2. jquery的css详解(二)
  3. MathType 6.9 介绍安装
  4. 【荐】PHP上传文件大小限制大全
  5. MySQL 数据库双向镜像、循环镜像(复制)
  6. ha456.jar打开dump文件报Unsupported major.minor version 51.0异常
  7. MySQL数据库初识(二)
  8. Loadrunner关联
  9. 函数buf_page_init_for_read
  10. vg
  11. Salesforce开发者学习笔记之二:Salesforce开发平台应用场景
  12. java内存模型3
  13. 初学 Python(十三)——匿名函数
  14. Numpy入门 - 生成数组
  15. Python爬虫! 单爬,批量爬,这都不是事!
  16. php递归实现一维数组转为指定树状结构 --- 省市区处理
  17. Java后台使用Websocket教程
  18. jq里验证插件的自定义方法Jquery.validator.addMethod()示例
  19. H3路由器映射端口到外网
  20. linux 下tftpf搭建

热门文章

  1. 用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)
  2. H5安卓端浏览器如何去除select的边框?
  3. Windows下的代码注入
  4. Django 常用字段和参数
  5. Codeforces Round #412 A Is it rated ?
  6. Android MediaRecorder实现暂停断点录音功能
  7. latex 调整间隔
  8. 深入理解mysql的底层实现
  9. javascript fundamental concept
  10. golang 安装 guru vscode 安装失败