V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  otakustay  ›  全部回复第 232 页 / 共 295 页
回复总数  5892
1 ... 228  229  230  231  232  233  234  235  236  237 ... 295  
2015-07-27 12:02:24 +08:00
回复了 qq2511296 创建的主题 分享发现 游侠 X 电动轿跑发布啦
我第一反应就是“这尼玛不是Tesla?”,去知乎看了下果然是Tesla
2015-07-27 11:56:13 +08:00
回复了 ibloging 创建的主题 程序员 请停止将 JavaScript 类型化(建议不要使用 class 实现类继承)
这作者简直在扯谈

《停止将JavaScript类型化,不要使用class》
《停止将JavaScript函数化,不要使用function作为第一级对象》

然后JavaScript就消失了呗

而且论点站不住脚,因为一个东西可能被人误解,所以我们不要用它,这样的话社会永远没有进步
2015-07-27 11:52:27 +08:00
回复了 haozhang 创建的主题 程序员 Nodejs 的 Promise 实现是不是有问题?
没错,race就是这么搞的,.map可以改成.each,更简单的写法:

Promise.race = (array) => new Promise((resolve, reject) => array.forEach((promise) => promise.then(resolve, reject)));

all要更麻烦些,有参数收集等
2015-07-26 19:46:09 +08:00
回复了 haozhang 创建的主题 程序员 Nodejs 的 Promise 实现是不是有问题?
v2ex评论不支持markdown对这类技术上的讨论确实很不友好,使用gist虽然能输入代码,但第一不能内联代码段,第二大量的小片段的代码用gist也很影响观看体验
2015-07-26 19:45:18 +08:00
回复了 haozhang 创建的主题 程序员 Nodejs 的 Promise 实现是不是有问题?
@haozhang 微博和GitHub都是otakustay

我来说下为啥上面 @haozhang 说的原理是错的。这个问题最根本的一个关键在于:race(或者all等其它和Promise有关的方法)的决定因素不是“Promise状态的变化”,而是“callback的执行”,所以“p1的状态是最先改变”这样的说法完全没用,比如我搞这样的代码:

var p1 = new Promise(function (resolve) { setTimeout(resolve, 1000); });
var p2 = Promise.reject();
setTimeout(function () {
var p3 = Promise.race(p1, p2);
p3.then(logResolved, logRejected);
}, 1500);

这代码里p3会进入resolved状态,但p1显然“比p2更晚改变状态”

所以再重复一次核心:决定因素是callback的执行

那么其原理要研究的就是,callback是啥时候执行的

在上面我贴规范的时候已经有提到一个词,叫enqueueTask。简单来说,就是浏览器有一个全局的任务队列,我们把一个个任务放到队列里,浏览器从队列里拿出来一个执行完再去拿下一个,每个任务的执行都是异步的
当然浏览器其实不一定只有一个队列,任务也不止一种,Promise产生的任务和setTimeout产生的就不一样,这种细节的事不展开说

然后还需要研究的是,在Promise执行过程中,什么时候执行enqueuTask。对于Promise来说也很简单,当then/catch被调用的时候,形成2种可能性:
1. Promise还没有resolve或reject,即处在pending状态,此时会把callback存下来,等进入某个状态时再把对应的callback一一enqueuTask
2. Promise本身已经在resolve或reject状态,则把给到的callback(当然要符合当前状态)直接enqueueTask

到这里这个逻辑其实就很简单了,主楼的代码分析下来是这样的:

1. 创建p1,此时任务队列为空,[]
2. 由于执行new Promise时给的executor函数,p1进入resolved状态,但注意此时并没有任何的callback,所以没有东西执行enqueueTask,队列还是空,[]
3. 创建p2、p3,不多说了,和p1一样,关键就是他们状态虽然是改变了,但根本没有任何callback,所以到此时为止队列依旧是空的,[]
4. 创建p4,用的Promise.race,race方法会分别给传入的Promise们调用then添加callback。所以这一段代码会依次**按顺序**给p1、p2、p3添加resolve和reject的回调,因为3个Promise状态都已经是确定的,所以会执行3次enqueueTask,队列变成[因p1导致p4变resolve, 因p2导致p4变reject, 因p3导致p4变resolve],这3个任务任意一个执行就会导致p4状态变化
5. 给p4挂上2个callback,不过此时p4状态没有改变还是pending,所以这2个callback不会enqueueTask
6. 这段代码执行完了,浏览器算是完成了一个任务,要去获取下一个任务,所以从队列中拿出第1个,即“p1导致p4变resolve”,队列变成2个任务,[因p2导致p4变reject, 因p3导致p4变resolve]
7. 执行拿出来的任务,于是p4被resolve了,且对应的value是p1里的“this is p1”,resolve的同时会把关联的callback放进队列,所以此时队列变成3个任务,[因p2导致p4变reject, 因p3导致p4变resolve, console.log(value)]
8. 继续拿下一个任务,拿出来“因p2导致p4变reject”并执行,但很遗憾p4现在已经是resolve状态了,所以这个任务执行了啥也不会发生,此时队列变成2个任务,[因p3导致p4变resolve, console.log(value)]
9. 下一个任务不多说了,反正p4是不会再变状态了,于是队列里还剩最后一个任务,[console.log(value)]
10. 把这最后一个任务拿出来执行,于是打印出来“this is p1”

JavaScript里凡遇到异步的问题,拿个笔画这个任务队列是最好的理思路的手段
2015-07-25 22:33:19 +08:00
回复了 haozhang 创建的主题 程序员 Nodejs 的 Promise 实现是不是有问题?
@haozhang 没有……我是JavaScript专精,但并不会NodeJS
2015-07-25 20:12:31 +08:00
回复了 li24361 创建的主题 程序员 公司准备使用 nodejs,那我们也能算前端工程师咯?
JavaScript工程师 ✓
前端工程师 ✕
2015-07-25 20:06:53 +08:00
回复了 haozhang 创建的主题 程序员 Nodejs 的 Promise 实现是不是有问题?
@haozhang 你观察的结果是对的,但你说的原理是不对的……今天身体不大舒服,明天记得的话可以at我一下我再来详细说这个事儿,蛮复杂的- -
2015-07-25 14:45:48 +08:00
回复了 csensix 创建的主题 问与答 一组 radio 未设置默认值,通过 js 无法正确获取其值
好好学jQ,天天向上

$('input[name="rad"]')拿的是name为red的input元素,.val()获取这些元素中第一个的值
管你有没有设默认值,这代码永远只能拿到第一个,所以别把自己绑在“未设默认值”这种奇怪的前提下

代码如 @swift 说的是对的,$('input[name="rad"]:checked').val(),记住每次都要用这段代码,你不能这样写:

var checked = $('input[name="rad"]:checked');
...用户做了好多事
...用户又做了好多事
checked.val()

能拿到才有鬼

好好学jQ,天天向上
2015-07-25 14:25:14 +08:00
回复了 xxxpara 创建的主题 前端开发 给定两个 css 的颜色值, 求两个颜色之间的 10 个等分色
直觉告诉我等分色要用hsl色来做,rgb搞不定……

像 @guesskiss 说的可以用opacity做,其实背景是白色的时候,opacity原理还是往ssl上靠的
2015-07-25 14:22:12 +08:00
回复了 haozhang 创建的主题 程序员 Nodejs 的 Promise 实现是不是有问题?
从我现在为止对Promise的认识来说,Zakas说的是错的,只能简单地表达下

Promise.reject的流程大概是这样的:

1. Let C be the this value.
2. Let promiseCapability be NewPromiseCapability(C).
3. ReturnIfAbrupt(promiseCapability).
4. Let rejectResult be the result of calling the [[Call]] internal method of promiseCapability.[[Reject]] with undefined as thisArgument and (r) as argumentsList.
5. ReturnIfAbrupt(rejectResult).
6. Return promiseCapability.[[Promise]].

1-3都是同步的操作,无非就是建一个叫PromiseCapability的东西出来,重点在第4步
第4步说的是调用PromiseCapability上一个叫[[Reject]]的方法,这个方法是什么,可以从规范里找出来。规范写得也是略复杂,总之找来找去,这个方法对应的是PromiseCapability Records这个东西上的[[Reject]]属性,它的解释是“The function that is used to reject the given promise object.”
然后继续往下找,可以在《Promise Reject Functions》这一节找到这个方法的说明:


1. Assert: F has a [[Promise]] internal slot whose value is an Object.
2. Let promise be the value of F's [[Promise]] internal slot.
3. Let alreadyResolved be the value of F's [[AlreadyResolved]] internal slot.
4. If alreadyResolved.[[value]] is true, then return undefined.
5. Set alreadyResolved.[[value]] to true.
6. Return RejectPromise(promise, reason).

上面这6步的重点显然在第6点,RejectPromise这个动作的说明是:

1. Assert: the value of promise's [[PromiseState]] internal slot is "pending".
2. Let reactions be the value of promise's [[PromiseRejectReactions]] internal slot.
3. Set the value of promise's [[PromiseResult]] internal slot to reason.
4. Set the value of promise's [[PromiseFulfillReactions]] internal slot to undefined.
5. Set the value of promise's [[PromiseRejectReactions]] internal slot to undefined.
6. Set the value of promise's [[PromiseState]] internal slot to "rejected".
7. Return TriggerPromiseReactions(reactions, reason).

重点在第7步,TriggerPromiseReactions:

1. Repeat for each reaction in reactions, in original insertion order
1.1. Perform EnqueueTask("PromiseTasks", PromiseReactionTask, (reaction, argument)).
2. Return undefined.

这里看到EnqueueTask就不用往下看了,这个操作是异步的,往任务队列里放一个任务来调用then/catch挂上来的回调

上面这个过程,从RejectPromise开始和new Promise(executor)是一模一样的,所以说白了new Promise和Promise.reject其实一样,到TriggerPromiseReactions为止挂上异步任务

所以new Promise(executor)里直接resolve和Promise.resolve是一个概念,都是“当前Promise的状态变了,所有回调加到任务队列”,那后面到底哪个会影响p4就完全看遍历顺序了
> 除了几个没人访问、狂按F5都能DDOS宕机的政府网站,其余都不兼容IE9以下的浏览器

是不是太激进了,兼容要求到IE8的站点大把大把的
用户不关心语法,只关心有多少功能,所以编辑器好的话你依旧可以不用HTML
推荐BBCode为基础的编辑器,都有比较成熟的方案
2015-07-24 13:30:05 +08:00
回复了 fabregaszy 创建的主题 iPhone 升级了 iOS 9 Public Beta 2
百度地图、百度Hi、挖财都不闪退了,车托之家进论坛贴子还是会退,无网络的时候百度贴吧会退
2015-07-24 11:14:14 +08:00
回复了 des 创建的主题 职场话题 大家对喊口号、唱歌、跳操这种企业文化怎么看?
根据不同行业的企业自然有不同的需要,工程相关的确实不适合这种管理方式,但并不代表这种方式本身是不好的,不然军队怎么算,会有人觉得军队走阵列必须整齐,喊口号必须响亮是恶心的吗?
直到3年前我也以为是八股

有些事,不是你自己写上百万行代码,删上几十万行代码,别人怎么说你都不会明白的
2015-07-23 16:40:48 +08:00
回复了 dhnUphp 创建的主题 程序员 天天吹键盘,问一下你们鼠标用的啥。。。。
MX518 + G500 + G700 + G9X
2015-07-23 11:18:28 +08:00
回复了 mio4kon 创建的主题 问与答 java 程序中如果有一段明文密码存在 String 中,是否能被查出?
扫描内存必然是能拿到的,具体知识你可以参考.NET上的SecureString类的文档
2015-07-23 11:15:45 +08:00
回复了 xohozu 创建的主题 职场话题 阿里内推吐槽篇
这是很正常的事啊,人才是很重要的,一个职位不合适的时候自然会考虑是否有更合适的职位让这个人才留下来,你要不高兴直接拒绝就是了

这真不是什么婉拒,楼主你并没有牛逼到阿里拒绝你需要委婉的程度,醒醒
1 ... 228  229  230  231  232  233  234  235  236  237 ... 295  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   823 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 51ms · UTC 19:30 · PVG 03:30 · LAX 12:30 · JFK 15:30
Developed with CodeLauncher
♥ Do have faith in what you're doing.