zoukankan      html  css  js  c++  java
  • 阿里前端测试题--关于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想要实现同步,各路神仙都有自己不同的理解和套路。

    后续更新。

  • 相关阅读:
    LeetCode 123. Best Time to Buy and Sell Stock III (stock problem)
    精帖转载(关于stock problem)
    LeetCode 122. Best Time to Buy and Sell Stock II (stock problem)
    LeetCode 121. Best Time to Buy and Sell Stock (stock problem)
    LeetCode 120. Triangle
    基于docker 搭建Elasticsearch5.6.4 分布式集群
    从零开始构建一个centos+jdk7+tomcat7的docker镜像文件
    Harbor实现容器镜像仓库的管理和运维
    docker中制作自己的JDK+tomcat镜像
    docker镜像制作---jdk7+tomcat7基础镜像
  • 原文地址:https://www.cnblogs.com/amingxiansen/p/9351415.html
Copyright © 2011-2022 走看看