Promise - javascript
2017-08-31 本文已影响3人
Zihowe
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);
});