回调方式
最传统以及最容易想到的一种方式。
在大量项目中,都有使用
举个栗子:
process1(data,function(data2){
process2(data2,function(data3){
process3(data3,function(data4){
console.log(data4)
}
})
}
promise 方式
对比下promise,promise 方式,实现了调用链扁平化
不过其本质还是回调
process1(data).then(data2=>{
return process2(data2)
}).then(data3=>{
return process3(data3)
}).then(data4=>{
console.log(data4)
})
async 和 await
再对比下使用async 和 await
async 和 await 在
async function main() {
var data2 =await process1(data);
var data3 =await process2(data2);
var data4 =await process3(data3);
console.log(data4);
}
main();
csp
关于什么是csp ,参考 csp
简单来说,就是使用chan 来处理并发问题。
比如golang、erlang等
查看一个例子:
这个例子有一个自然数生成器。
然后另外一边则取数据然后打印
async function generate(ch) {
for(var i=0;true;i++){
await ch.put(i)
}
}
async function main(){
var ch=new jschan.Chan();
generate(ch);
while(true){
console.log(await ch.get());
}
}
main();
再举个例子:
当要实现,向后端有N个请求,异步发送并等待
async function fetch(url,ch){
var data=await Fetch(url);
await ch.put({
url:url,
data:data
})
}
async function main(){
var ch=new jschan.Chan();
fetch(url1,ch)
fetch(url2,ch)
fetch(url3,ch)
await ch.get()
await ch.get()
await ch.get()
}
main()
场景如果更复杂一些,优势就比较明显了。
基于以上描述,可以做很多事情。比如 WaitGroup Select 或其他东西
然而,看到这里,你估计发现了。上面的jschan 是什么鬼?
其实,js语言并未支持channel。这里是我的一个简单实现。