将来和未来

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

异步编程的核心:  程序中现在运行的部分和将来运行的部分之间的关系。

var data = ajax( "http://some.url.1" );
console.log( data );

增加回调,虽然可以同步ajax请求,但是一定不要这样做,因为他会锁定一切

解决办法
ajax( "http://some.url.1", function myCallbackFunction(data){
console.log( data ); 
} );

分离以下代码的现在和将来执行部分

function now() {
return 21;
}
function later() {
answer = answer * 2;
console.log( "Meaning of life:", answer );
}
var answer = now();
setTimeout( later, 1000 ); // Meaning of life: 42

 

现在:
function now() {
return 21;
}
function later() { .. }
var answer = now();
setTimeout( later, 1000 );
将来:
answer = answer * 2;
console.log( "Meaning of life:", answer );

 

 

千万不要在异步中使用同步的这种想法,因为会锁定一切。

 

事件循环

// eventLoop是一个用作队列的数组
// (先进,先出)
var eventLoop = [ ];
var event;
// “永远”执行
while (true) {
// 一次tick
if (eventLoop.length > 0) {
// 拿到队列中的下一个事件
event = eventLoop.shift();
// 现在,执行下一个事件
try {
event();
}
catch (err) {
reportError(err);

}

}

 

并行线程

并行计算最常见的工具就是进程和线程。进程和线程独立运行,并可能同时运行:在不同
的处理器,甚至不同的计算机上,但多个线程能够共享单个进程的内存

JavaScript 从不跨线程共享数据

 

理解以下代码:

var a = 20;
function foo() {
a = a + 1;
}
function bar() {
a = a * 2;
}

ajax( "http://some.url.1", foo );
ajax( "http://some.url.2", bar );

 

并发:

并发合作方式:

1、非交互

两个或多个“进程”在同一个程序内并发地交替运行它们的步骤/ 事件时,如果这些任务
彼此不相关,就不一定需要交互。如果进程间没有相互影响的话,不确定性是完全可以接
受的。
举例来说:
var res = {};
function foo(results) {
res.foo = results;
}
function bar(results) {
res.bar = results;
}

ajax( "http://some.url.1", foo );
ajax( "http://some.url.2", bar );

 

2、交互

  var res = [];
function response(data) {
res.push( data );
}

ajax( "http://some.url.1", response );
ajax( "http://some.url.2", response );

以下是改进

var res = [];
function response(data) {
if (data.url == "http://some.url.1") {
res[0] = data;
}
else if (data.url == "http://some.url.2") {
res[1] = data;
}
}

ajax( "http://some.url.1", response );
ajax( "http://some.url.2", response );

 

再来一代码

var a, b;
function foo(x) {

a = x * 2;
baz();
}
function bar(y) {
b = y * 2;
baz();
}
function baz() {
console.log(a + b);
}

ajax( "http://some.url.1", foo );
ajax( "http://some.url.2", bar );

改进:

var a, b;
function foo(x) {
a = x * 2;
if (a && b) {
baz();
}
}
function bar(y) {
b = y * 2;
if (a && b) {
baz();
}
}
function baz() {
console.log( a + b );
}

ajax( "http://some.url.1", foo );
ajax( "http://some.url.2", bar );

 

3、协作

    var res = [];
function response(data) {
res = res.concat(
data.map( function(val){
return val * 2;
} )
);
}
ajax( "http://some.url.1", response );
ajax( "http://some.url.2", response );

改进:

var res = [];
function response(data) {
var chunk = data.splice( 0, 1000 );
res = res.concat(
chunk.map( function(val){
return val * 2;
} )
);
if (data.length > 0) {
setTimeout( function(){
response( data );
}, 0 );
}
}
ajax( "http://some.url.1", response );
ajax( "http://some.url.2", response );

处理异步的方法:

1.回调函数    

转载于:https://my.oschina.net/u/2285087/blog/871655


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部