JS的Promise async await
之前看了太多大约都不是官方文档看得自己晕乎乎, 直到今天决心用MDN看看
使用Promise
Promise对象的构造器
const p = function(param){
new Promise((callItWhenResolved, callItWhenRejected)=>{
if(doSomethingOk){callItWhenResolved(resovledResultAsParam)}
else{callItWhenRejected(rejectedResultAsParam)}
})
}
p(Real_param).then(function callItWhenResovled(resovledResultAsParam){})
所以Promise构建的函数,具体来说就是返回一个promise对象的函数. 这个函数的主要操作完成后, 在promise对象的构造器中根据操作结果执行resolved()函数或者rejected()函数.这两个回调函数放在p().then()中定义.
async await只是Promise的语法糖.
async function af(){
function callItWhenResovled(resovledResultAsParam){}
callItWhenResovled(await p(Real_param))
}
也能合并简写为:
async function af(){
(function callItWhenResovled(resovledResultAsParam){})(await p(Real_param))
}
如果callItWhenResovled已经定义过,当然又可以省却定义的过程,例如console.log
async function af(){
console.log(await p(Real_param))
}
所以: await aPromiseObject
,得到的是正常完成后的返回值resovledResultAsParam. 这个返回值会输入callItWhenResovled函数作为参数,并执行callItWhenResovled.
这儿特别晕的地方就是, 回调函数callItWhenResovled的参数, 表面上是aPromiseObject在await等待的返回值resovledResultAsParam, 实际上这个返回值在Promise对象构建的时候,并没有一个return resovledResultAsParam
, 却是以callItWhenResovled实参的方式提供返回值的callItWhenResovled(resovledResultAsParam)
. 这个透过输入实参造成输出return的效果确实让人好晕.
所以async函数干脆在函数尾部使用return 返回值
来替代这种回调函数(实参返回值)
,使得这个逻辑一下子清晰了很多. 而其返回的实质相当于return new Promise((resolved)=>{resolved(返回值)})
.
而await的作用,就是进行Promise的脱壳,将一个promise对象变成其resolved返回值. await 异步函数()
相当于异步函数返回的Promise对象.then()
, 而某个函数(await 异步函数())
相当于异步函数返回的Promise对象.then(某个函数)
.
这儿有个重要区别:
某个函数(await 异步函数()) //只能在async函数内使用await
异步函数返回的Promise对象.then(某个函数) //在普通函数中也可以使用,应用范围更广些了
JS返回Object深度引用值
x={a:{b:{c:1}}}
这个Object, 如果是x.a还可以写作x['a'], 然而x.a.b.c却只能写作x['a']['b']['c'], 对于深度不定的Object来说, 会比较难以引用.
一个简单的方式是用危险的eval函数, 写作eval('x.a.b.c')
.
那么eval又这么危险, 又推荐了比较安全Function函数:
Function('return x.a.b.c')()
否则就要更加复杂啦:
function objValue(str){
var keys = str.split('.')
var current = this
for(var key of keys){ current = current[key] }
return current
}
objValue('x.a.b.c')
PWA应用
lavas
js13kpwa PWA游戏
appspot 墙外
appscope
疑问
PWA能访问本地文件系统吗?
PWA能调用本地应用吗?
PWA应用能离线发布给其他人吗?
似乎PWA应用按不同商店、不同系统、不同浏览器而不同。windows商店中的 PWA应用可以作为md文件浏览器,但只能用于Win10,在Win7的Chrome中也有PWA应用,可以在桌面建立快捷方式,单怎么看都比网页快捷方式强不到哪儿去。
充满疑惑上知乎,看了这篇2019-12-17的新鲜答案后对PWA看来也是失望透顶啦!还不如微信小程序,哈哈
从PWA似乎又引出一个Flutter,看了下,能开发IOS和Android的应用。Windows看来是没戏的。只是不知道这玩意儿相比快应用又如何。
windows原生应用开发的路与坑
晚上下班8点多,基于一个很简单的原因:Electron的应用好几十M太大了,我想看能否有不那么臃肿的应用,我先是找到了vuido,基于vue开发的体积更小的原生应用听起来很符合我的胃口。可是,按作者说,Vuido的应用仍然有20M+,并且至今为止已经有2年没有维护了。我是想有没有1M以内的应用呢?编译完最简单的Hello World应该是在几十到几百K的大小。
微软的传统原生应用开发平台是Visual Studio,专业版本是收费的,不过这些年有免费社区版。然而,VS向来体积巨大,一个功能包动辄4~5G,一点儿也不优雅,还不如基于Electron的VScode,这可能就是所谓的历史包袱吧。
既然VScode是微软家的,我也不想要什么图形编程界面,那么有没有基于Vscode的原生应用开发方式呢?找来找去,找到了.net core。号称跨平台开发、跨平台运行。
.net core这家伙直到3.0以前都不支持桌面GUI应用,默认都是console应用!.net core最新版本是3.1,也就是才支持桌面应用不久。支持的桌面应用框架是Winforms和WPF。
那么Winforms和WPF到底哪个好呢?经过对比,发现WinForms更加古老,WPF更新些。区别是Winforms用cs文件(C#)编写界面和逻辑,而WPF用XAML(XML形式)编写界面,cs编写逻辑(还支持VB、F#)。嗯,这听起来还比较合理,对比h5和js。
然后就开始写。xaml跟HTML果然有些像的。那么,问题来了,怎么vscode预览xaml呢?答案是不行。网上有人提了个issue给.net core开发者,开发者的反馈是:基本上没有人用vscode开发WPF,大家都用VS!最后还把这个球踢给了vscode团队,然后vscode团队给这个issue标了个out of range超范围了!
我靠。
只能又下载VS。然后发现我可能两年前装了VS2017,打开后让我升级,升级包好几个G!然后又看到VS最新的版本是2019。那么嫩不能不用卸载-下载-安装就可以直接升级到VS2019呢?网上真有人问。回答是:No。说这俩是不同Channel的,如果你装了2019,机子里会同时共存两个:2017和2019,说,你还是卸载了吧!
好吧,我卸载2017。过程好慢。到半夜12点多了,还没有卸载完!第二天在搞吧!
第二天也就是今天,卸载完了。但是居然报了个错:卸载失败!赶快去安装目录看看,还好除了留着一个2017的空目录再没有什么内容了。然后就漫长等待装2019,去吃个饭先。
吃饭时再看相关文章。发现WinForm/WPF之后,还有个UWP!这货支持HTML+JS!再看WPF,似乎近多年以来微软都没有再怎么在WPF上使劲儿,开发者对此还多有怨言。那就转向UWP?
然而,问题又来了:1、UWP只支持Win10;2、应用要上Windows商店。额,UWP有些耳熟,我记得是不是已经相当于阵亡状态,只是微软秘不发丧?查了下相关报道,还真是个这样!
UWP几乎已死WPF又上不来这怎么搞?况且UWP就算没死还不支持Win7也不是办法。这时候有人说,有个叫Xaml island的东西,可以在WPF框架里放UWP!不知道这个是不是救星。
另外,微软在放弃UWP、WPF之后,又搞了个PWA,不知道是什么东西,能不能用呢?
Windows原生GUI APP|Csharp C#入门
原意是通过vscode快速开发一个Windows GUI。 不想用electron的原因是electron打包出来的app太大。
通过框架选择,似乎只有.net core适合vscode。又发现.net core3.1只支持WinForms和WPF两种GUI框架。
通过对比,WPF似乎是更先进的。查看代码发现WPF中xaml类似HTML布局的作用,.cs写代码,而Winforms用一个cs文件写布局另一个cs文件写逻辑……不喜欢。还是WPF符合我的要求。
接着开始写xaml。这玩意儿写布局总得有个预览吧。HTML直接用任何一个浏览器打开看就行了。xaml呢?能不能在Vscode中编辑?搜索了下,真有人问了这个问题,然而回答却是残酷的:
I like the idea of a XAML editor in VS Code. But honestly all WPF and WinForms developers I know use Visual Studio. And as WPF and WinForms in .NET Core are still Windows-only UI stacks, there's no reason why you shouldn't use Visual Studio. But for cross-platform stuff it would make sense, yes. And for those who want to use VSCode for everything. :)
我喜欢VS Code中的XAML编辑器的想法。但老实说,我认识的所有WPF和WinForms开发人员都使用Visual Studio。而且由于.NET Core中的WPF和WinForms仍然是仅Windows的UI堆栈,因此没有理由不应该使用Visual Studio。但是对于跨平台的东西,这是有道理的,是的。对于那些想要对所有内容使用VSCode的人。:)
.net core
C
中文指南
类型|JS|C#
--|--
整数| |int
浮点| |double
固定点| | demical
foreach(x in xs){}
WPF
中文指南
学习H5架构的原生Windows应用架构
Excel筛选不重复记录
要用到高级功能呢,呵呵, 看看百度经验
主要是:
1 连同标题行选择数据区域后, 选择数据-排序与筛选-高级
命令. 如按关键字段筛选, 只选择关键字段列就好.
2 对话框中, 列表区域
选择单列的话,只会以单列计算, 选择多列的话, 多列之间是"与"的关系.
3 勾选选择不重复的记录
, 确定.
Node执行本机命令
var exec = require('child_process').execSync;
var cmd = "echo 'hello world'";
var options = {
encoding: 'utf8'
};
console.log(exec(cmd, options));
获取本机保存的WIFI SSID和密码
今天装Canon G5800打印机驱动时候忽然给我把我自己的Wifi密码全列出来了, 让我很震撼,哈哈
Windows
- 输入
netsh wlan show profile
获取本机已保存的wifi SSID - 3.输入
netsh wlan show profile name=“ ” key=clear
获取密码 name里写入WiFi SSID
Github上有个WIFIpass项目可以用Python一键获取,不过我觉得批处理应该也可以有类似效果. 果然在这个网址找到了bat的方式, 试了下,只适用于英文版Windows,中文的要修改下. 代码如下:
@echo off
::
:: (c) Elias Bachaalany <lallousz-x86@yahoo.com>
:: Batchography: The Art of Batch Files Programming
::
setlocal enabledelayedexpansion
:main
title WiFiPasswordReveal v1.0 (c) lallouslab.net - The Batchography book
echo.
echo Reveal all saved WiFi passwords Batch file script v1.0 (c) lallouslab.net
echo.
echo Inspired by the book "Batchography: The Art of Batch Files Programming"
echo.
:: Get all the profiles
call :get-profiles r
:: For each profile, try to get the password
:main-next-profile
for /f "tokens=1* delims=," %%a in ("%r%") do (
call :get-profile-key "%%a" key
if "!key!" NEQ "" (
>>"C:\WiFi-Passwords.txt" echo WiFi: [%%a] Password: [!key!]
)
set r=%%b
)
if "%r%" NEQ "" goto main-next-profile
echo.
pause
goto :eof
::
:: Get the WiFi key of a given profile
:get-profile-key <1=profile-name> <2=out-profile-key>
setlocal
set result=
FOR /F "usebackq tokens=2 delims=:" %%a in (
`netsh wlan show profile name^="%~1" key^=clear ^| findstr /C:"Key Content"`) DO (
set result=%%a
set result=!result:~1!
)
(
endlocal
set %2=%result%
)
goto :eof
::
:: Get all network profiles (comma separated) into the result result-variable
:get-profiles <1=result-variable>
setlocal
set result=
FOR /F "usebackq tokens=2 delims=:" %%a in (
`netsh wlan show profiles ^| findstr /C:"All User Profile"`) DO (
set val=%%a
set val=!val:~1!
set result=%!val!,!result!
)
(
endlocal
set %1=%result:~0,-1%
)
goto :eof
JavaScript扩展(合并)Object
使用Object.assgin(ObjToExpand, ObjWithNewData)
var obj1 = {
a:1,
b:2
};
var obj2 = {
c:3,
d:4
};
Object.assign(obj1,obj2);
console.log('obj1',obj1); //{a: 1, b: 2, c: 3, d: 4}
console.log('obj2',obj2); //{c: 3, d: 4}
吹哨人与预测
在重大事件爆发的质变之前,往往有一个量变酝酿期.在量变开始的时候, 有部分敏锐的人知道了,并且宣传了出来(吹哨人). 然而任何国家和地方政府都是维稳和不专业的,会有意无意的不传播这个事件.这就形成了重大事件必然爆发的预测.
重要的一点是,重大事件的爆发,会引发哪些必然产生的关联事件?就如同蝴蝶效应. 但又和蝴蝶效应不同的是,蝴蝶效应的影响方向是随机的,而重大事件的影响方向有很多是确定和必然的.要如同公式一般预先推导出因果关系,就能形成预测.
我觉得在教西方拉丁语系历史的时候,应该把人名地名中英文并列
我觉得在教西方拉丁语系历史的时候,应该吧人名地名中英文并列, 并且指出相关语源, 原因是:坑爹的翻译....
- 英国-英格兰:这个翻译就有大问题, 英国在国际上称呼是UK, 是United Kingdom of Great Britain and Northern Ireland的简称,全文一个"英"字都没有. 而英格兰是England,只是英国的部分区域. 这个翻译会让人误解英国是英格兰国.更广泛的代表英国人的应该是British而不是English.
- 英格鲁-盎(音:昂)格鲁. 如果是盎格鲁,你会觉得跟英国毛关系没有, 其实英格鲁盎格鲁都是Anglo, 而Anglo是西班牙语的English. 另有一说是中古英语中英国人被称为Angelcynn, Angles的家庭. 当然越古老,西语/英语的区分越少. Angles是公元5世纪移民到England的一个Germanic(日耳曼,德国)人. Angle和Angel这俩词好像.
- Anglo-Saxon(翻译为英格鲁撒克逊)经常并称, 而Saxon(德语Sachsen)实际上是德国东部现在的一个州萨克森自由州, 其州府Dresden德累斯顿是东德仅次于柏林的第二大城市. Angles前面说了是个人,也是个部落,和Saxons部落在公元5世纪左右移民去了英国, 构成了最早的Anglo-saxon人.
英文俚语
dead-tree 纸质书,纸质的. 纸=死掉的树,哈哈
- 引申为dead-tree format (纸质版), dead-tree-ware (纸件)
网站
merriam webster , 好像会给这些俚语一个正确的解释, 而不是把deadtree翻译成死树. 比如今日(2020-2-26)的流行词就是pandemic
JScript和Javascript
这两个之间关系的历史似乎非常古老了.
这儿有一篇文章讲述两者间的不同,两者都是js后缀, 似乎主要的不同是JScript对ActiveX通过IE进行控制.
MDN上的说明
JScript 手册