V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  libook  ›  全部回复第 213 页 / 共 247 页
回复总数  4932
1 ... 209  210  211  212  213  214  215  216  217  218 ... 247  
2019-01-29 09:47:05 +08:00
回复了 shawncheung 创建的主题 Node.js Promise 杂谈
@azh7138m 你开心就好
2019-01-29 00:16:22 +08:00
回复了 shawncheung 创建的主题 Node.js Promise 杂谈
@azh7138m

我看不大懂你写的。。。
你的第一个代码,api 函数执行如果是异步过程的话,你的 try 永远捕捉不到任东西。
第二个的问题不是在于 rpc 是不是用 Promise 实现,而是 urls 暴漏在那么广的作用域下会有风险(让然代码逻辑处理好也是可以没问题的),把 urls 封装在 Promise 里,通过每一级的.then 向下传播,中间不可能被外界作用域的程序篡改:

```
let urls = {};

let theP = new Promise((res, rej) => {
let urls = {};
res(urls);
}).then(urls => {
urls["domain 点 com"] = 3;
return urls;
});
urls["domain 点 com"] = 2;
theP.then(urls => {
console.log(urls["domain 点 com"]);
});
```

这里边有两个 urls,但是 Promise 能保证调用链中传递的 urls 不受外部作用域的 urls 的操作影响。

上面说的都不是绝对的,得看实际情况。

bable 可以根据需求转换语法,最著名的是把 ES6+转换成纯 ES5,最早 core.js 部分就包含 Promise 的 polyfill 了,只不过现在很多人不需要那么苛刻要求转成 ES5。
去看一下 @babel/polyfill 文档吧。
2019-01-28 19:05:13 +08:00
回复了 shawncheung 创建的主题 Node.js Promise 杂谈
@azh7138m 可靠性的体现是:

//Promise 的错误捕捉机制
(new Promise((res, rej) => {
haha;//这里因为找不到"haha"是什么,所以会报一个错
}
)).catch((error) => {
console.log('捕捉到错误了');
return [];
}).then((result)=>{
console.log(`得到的数组的长度为${result.length}`);
});

//一般值传递回调函数的错误捕捉机制
function cb1(cb) {
let result;
try {
result = Math.random();//这里假设做了某种操作,我用 Math.random()来举例
} catch (error) {
cb(error);
}
haha;//这里因为找不到"haha"是什么,所以会报一个错
cb(null, result);
}

function cb2(error, result) {
if (error) {
console.error(error);
} else {
console.log(result);
}
}

cb1(cb2);

Promise 内部有任何问题,包括语法问题,都可以通过后边挂载的 catch 回调捕捉到;但 callback 不一样,得自己在自己觉得可能会有问题的地方加 try/catch,如果 try 没有覆盖到出错误的点,就可能会造成整个程序崩溃。相比来说,因为 Promise 的错误捕捉机制用起来更加简洁、覆盖面更广,所以反映在规模性的项目上可能可靠性更好。你也可以抬杠说在回调函数里每次都全局 try,但相比 Promise 来说要多写一点代码吧,而且看起来也不如 Promise 那么言简意赅。

作用域混乱我是特指的是楼主博客里的一个用法:

let urls = {};

function rpc (url, callback) {
if (urls[url]) {
return callback(urls[url]);
}
request(url, (err, res) => {
urls[url] = res;
callback(err, res);
});
}

urls['domain.com']=3;

oo();//这里可能是手误修改了 urls

rpc('domain.com',console.log);

function oo() {
urls['domain.com'] = 2;
}


这里 urls 暴露在一个相对宽广的的作用域下,如果在调用 rpc 之前还有其他的代码执行,则有可能会有意无意地修改 urls 的值,有意的还好,无意的就会产生逻辑 BUG 了。

以上都是针对一些实际情况举的例子,不是为了说明 Promise 一定就比 callback 好用,而是说明 Promise 能解决一些以往使用 callback 的痛点,实际上 Promise、Generator、Async/Await 都是语法糖,都是可以用 callback 实现的(要不然 babel 就不存在了),应用语法糖在特定情况下用可以事半功倍,但如果有的地方你觉得用 callback 最合适,也没必要非要赶着上 Promise。
2019-01-28 16:02:19 +08:00
回复了 shawncheung 创建的主题 Node.js Promise 杂谈
@azh7138m 不是 callback 和 Promise 的本质上的区别,因为 callback 其实也是可以逐级传递错误信息的,只不过用 callback 可以有多重实现方案,而 Promise 只提供了唯一方案,相比来说 Promise 更标准更可靠,标准化的好处就是任何第三方包都遵循标准任何人都可以直接使用,不会遇到错误传递方案不同导致的不兼容。

楼主举得例子不恰,外部放置临时变量来记录异步操作是否成功的方法只是 callback 传递状态的众多办法中的一种,而且可能是最差且几乎没人用的方法,这个方法有很多弊端,比如作用域混乱导致的调试成本太高,以及可读性差等,callback 在调用链上做状态传递是能规避这个方案带来的很多问题的,比较起来,Promise 是用统一标准方案来实现的状态传递,兼容性有保障。
只订阅了几个人,要么就是看鬼畜和番剧,再不济就是定向搜索按排名看,接触不到营销类的内容。
2019-01-27 15:49:07 +08:00
回复了 FakeLeung 创建的主题 问与答 win10 现在有 WSL 了,但是为什么不能在上面做开发?
有文件改动监听的功能得注意一下,watch 和 git 的追踪功能都是用操作系统的 API 实现的,wsl 和 win 还是两个操作系统,各自有各自的 API 来实现监听文件修改的功能,又因为 wsl 运行于 win 之上,所以 wsl 内修改文件的时候 win 是知道的,但 win 修改文件 wsl 是无法知道的。

@FakeLeung
2019-01-26 20:39:03 +08:00
回复了 aloyuu 创建的主题 问与答 为什么使用投影机取代电视 装在卧室的人不多??
亲测。

风扇噪音普遍大,
非专业银幕效果差(分辨率),
白天或开灯状态下对比度难比电视差很多,
对焦神烦,
贵。

不过对于租房的人来说还是比买电视搬家方便。
2019-01-26 20:33:36 +08:00
回复了 dreamweaver 创建的主题 问与答 公司内部抽奖 h5, nodejs+sqlite 可行吗?
node 是异步非阻塞机制,所以请求不会排队。通常数据库操作需要加锁。

其实也可以不加锁。可以单独开一个表做计数器,抽奖抽到先更新计数器加 1,看更新后返回的结果,如果数量未超就记录中奖者,如果数量超了就变成未抽到。
2019-01-26 20:20:47 +08:00
回复了 kejipa 创建的主题 音乐 有主要喜欢纯音乐的吗?我建了一个群每天分享音乐
什么类型的纯音乐呢?

古典? new age 代表的轻音乐、jazz ……我个人是在听史诗,比如 x-ray dog、epic score、audio machine。
2019-01-26 20:12:40 +08:00
回复了 ericgui 创建的主题 程序员 有什么样常用的可逆加密算法?
加密算法都是可逆的,因为加密最终还是要解密的,否则就是摘要或有损压缩。
同一个密钥就可以完成的加解密通常是对称加密,当然私钥能推导出公钥的非对称加密也可以。去维基上搜一下对称加密算法都有什么就知道了。
另外经典密码学里也有一些可以用的,比如凯撒密码( rot13 甚至连加解密算法都是一样的),以及密码表。
2019-01-26 20:06:57 +08:00
回复了 FakeLeung 创建的主题 问与答 win10 现在有 WSL 了,但是为什么不能在上面做开发?
@huclengyue 我只跑了个 terminator,没问题,个人感觉性能上不如虚拟机,如果你的 win 硬件还不错的话性能应该能忍。

我没成功启动 gnome,能折腾的话可以研究一下。启动一个 terminal emulator +一个 IDE 估计是 OK 的。
2019-01-25 19:53:39 +08:00
回复了 FakeLeung 创建的主题 问与答 win10 现在有 WSL 了,但是为什么不能在上面做开发?
watch 和 git 的追踪功能都是用操作系统的 API 实现的,wsl 和 win 还是两个操作系统,各自有各自的 API 来实现监听文件修改的功能,又因为 wsl 运行于 win 之上,所以 wsl 内修改文件的时候 win 是知道的,但 win 修改文件 wsl 是无法知道的。
2019-01-25 19:47:00 +08:00
回复了 FakeLeung 创建的主题 问与答 win10 现在有 WSL 了,但是为什么不能在上面做开发?
我是在 win 下装 xserver,然后 wsl 连 win 下的 xserver 展示图形界面。理论上可以用 xserver 在 wsl 下用 IDE 开发。
2019-01-25 19:39:20 +08:00
回复了 luvxy 创建的主题 程序员 想学习网络知识,有啥建议
有一个系列叫 图解 xx

图解 tcp
图解 http

有趣且通俗易懂,可以作为入门。
2019-01-25 10:26:41 +08:00
回复了 d284476422 创建的主题 问与答 过年给长辈送礼送什么?
@d284476422 酒的话看个人喜好吧,外贸港口地区的人也比较喜欢白兰地、威士忌之类的洋酒,中国白酒并不是所有人都喜欢酱香型,有些人喜欢浓香型。
也不是得买特别贵的八九百上千那种的,看关系好不好,北方地区 200-600 一瓶的就差不多。

或者你了解一下对方喜欢什么,瓷器、古董、茶具、(盘)核桃、PS4。。。
2019-01-24 18:30:48 +08:00
回复了 d284476422 创建的主题 问与答 过年给长辈送礼送什么?


本来想说烟酒茶,但个人不喜欢烟,就觉得要说酒、茶,结果你嫌酒贵。。。
2019-01-24 16:30:12 +08:00
回复了 az09py 创建的主题 Node.js node 中间层转发文件上传是否必须将文件存在本地呢
看你想做哪些事情了,如果什么事情都不做,直接把上游发来的文件传递给下游,可以直接把 Stream 传递过去。

```
http.createServer(function(req, res) {
//这里的 req 是个 Stream
const options = {
hostname: 'http://你的上传服务器地址',
port: 80,
path: '/upload',
method: 'POST',
headers: {
//这里写一些必要的头
}
};

/**
* 这个 uploadReq 也是个 Stream
*/
const uploadReq = http.request(options, (res) => {
//这里处理上传服务器的 response
});

req.pipe(uploadReq);//关键点,把上游发来的 Stream 直接管道接到下游上传服务器的 Stream 上


}).listen(8080);
```

上面是个示范,不是一个可执行的代码,只是提供一个思路。
这个策略一点都不麻烦,做爬虫的精髓是只要用户能看到,机器就能采集到,而且现在有 Puppeteer 这样的工具,你完全区分不出来是人在访问还是机器在爬。
但控制访问频率可能有效果,比如单个 IP10 秒钟内只能请求 10 次。
2019-01-24 14:10:06 +08:00
回复了 az09py 创建的主题 Node.js node 中间层转发文件上传是否必须将文件存在本地呢
不需要吧,用 Stream,先建立客户端发来的请求的读 Stream,然后再建立转发到目标服务的写 Stream,然后两边管道接在一起。
1 ... 209  210  211  212  213  214  215  216  217  218 ... 247  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1593 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 47ms · UTC 16:55 · PVG 00:55 · LAX 09:55 · JFK 12:55
Developed with CodeLauncher
♥ Do have faith in what you're doing.