美文网首页
Promise - javascript

Promise - javascript

作者: Zihowe | 来源:发表于2017-08-31 16:37 被阅读3次

javascript 是单线程的,所以如果promise里面的操作是耗时的话,一样也会阻塞后面的代码执行。

base case

"use strict";

function f1 (count) {
    return new Promise(function(resolve,reject){
        if(count <= 0) reject("reject! count <= 0 ");
        
        // block the thread
        for (var i = 0; i < count; i++) {
            for (var k = 0; k < count; k++) {
                // do nothing 
            }
        }
        let j = i;
        resolve(j);
    });
};

// 下面的代码,第一个f1会阻塞第二个f1
f1(100000).then(function(result) {
    console.log(result);
});

f1(99).then(function(result) {
    console.log(result);
});

advanced case

下面的代码
f1依然是个阻塞的promise
n1使用了setTimeout,不回阻塞promise返回
但是在900ms之后, 里面的方程被放到执行queue里执行
因为这是耗时的任务,然后n1就会阻塞后面的程序执行

在1000ms之后,n2的方程被放到执行queue里执行
这个并不耗时,但是n2被n1阻塞了

"use strict";

function f1 (count) {
    return new Promise(function(resolve,reject){
        if(count <= 0) reject("reject! count <= 0 ");
        
        // block the thread
        for (var i = 0; i < count; i++) {
            for (var k = 0; k < count; k++) {
                // do nothing 
            }
        }
        let j = i;
        resolve(j);
    });
};

function n1 (count){
    return new Promise(function(resolve,reject){
        if(count <= 0) reject("reject! count <= 0 ");
        
        
        setTimeout(function(){
            // not block current thread
            // but it will block after 800ms
            for (var i = 0; i < count; i++) {
                for (var k = 0; k < count; k++) {
                    // do nothing 
                    
                }
            } 
            
            console.log("n1 completed");
        }, 800);
        
        resolve("n1 rsolve");
    });
};


function n2 (count){
    return new Promise(function(resolve,reject){
        if(count <= 0) reject("reject! count <= 0 ");
        
        var outer2 = "n2 completed";
        
        setTimeout(function(){
            // not block thread
            // but it will be blocked by n1 因为n1先到被从执行队列里取出来
            for (var i = 0; i < count; i++) {
                for (var k = 0; k < count; k++) {
                    // do nothing 
                    
                }
            } 
            
            console.log(outer2);
        }, 1000);
        
        resolve("n2 resolve");
    });
};


// 不会block f1
n1(100000).then(function(result) {
    console.log(result);
});

// 不回block f1, 但是里面的timeout代码会被n1 block
n2(1000).then(function(result) {
    console.log(result);
});


f1(1000).then(function(result) {
    console.log(result);
});


f1(9).then(function(result) {
    console.log(result);
});

相关文章

网友评论

      本文标题:Promise - javascript

      本文链接:https://www.haomeiwen.com/subject/nwwqjxtx.html