我最近在Node JS中做了很多工作,并且重点是异步模块使我依赖于对闭包应用bind函数来将异步调用包装在循环内(以保留函数调用时变量的值)。这让我开始思考。将变量绑定到函数时,可以将传递的值添加到该函数的本地范围。因此,在Node(或通常引用超出范围变量的任何JS代码)中,将超出范围变量(例如模块)绑定到函数以便在使用时它们成为局部范围的一部分是否有利?
普通JS中的示例:
var a = 1,
func1 = function(b) { console.log(a,b); },
func2 = (function(a,b) { console.log(a,b); }).bind(null, a);
//func1(2) vs func2(2)
Run Code Online (Sandbox Code Playgroud)
节点中的示例
var fs = require('fs'),
func1 = function(f) { fs.stat(f, function(err, stats){}); },
func2 = (function(fs, f) { fs.stat(f, function(err, stats){}); }).bind(null, fs);
//func1('file.txt') vs func2('file.txt')
Run Code Online (Sandbox Code Playgroud)
在我上面的示例中,func1或func2是否会比其他示例明显更快(不包括外部因素,例如获取文件统计信息需要多长时间)?
这是我凑在一起的一个JSFiddle,它做了一个快速而肮脏的基准测试:http : //jsfiddle.net/AExvz/
我已经为IE 9和8 截取了我的文件输入法的截图.为什么IE不显示浏览按钮?该表位于如下形式:
<table>
<tr>
<td colspan="2"><h3>Upload Photo</h3></td>
</tr>
<tr>
<td colspan="2"><input type="file" name="mapimage" id="mapimage"/></td>
</tr>
<tr>
<td><input type="submit" value="Upload" name="update_image" id="update_image"/> </td>
<td><img id="loading" src="images/loading.gif" alt="working.." style="visibility: hidden;" /></td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
我已经尝试添加一个大小属性,但它仍然没有出现.IE 8及以下版本是否有任何解决方法或这是一个已知问题?
GAS对以下说明进行了以下编码:
push rbp # 0x55
push rbx # 0x53
push r12 # 0x41 0x54
push r13 # 0x41 0x55
Run Code Online (Sandbox Code Playgroud)
从AMD64规范(页313):
PUSH reg64 50 +rq将64位寄存器的上下文压入堆栈.
由于用于偏移rbp和rbx5个和3个,分别为第一两种编码有意义.但是我不明白最后两个编码是怎么回事.
据我所知,0x40-0x4f是一个REX前缀和0x41具有REX.B位集(其是一个扩展的MSB MODRM.rm或SIB.base,根据该外部参考).规范提到要访问所有16个GPR,你需要使用REX,但目前还不清楚截止点在哪里.
通过查阅MODRM和SIB的文档,我不认为使用了SIB,因为它的目的是使用base + offset寄存器进行索引(虽然说实话,我不能真正告诉你如何区分MODRM和SIB只是给出了编码).
所以,我怀疑这里使用的是MODRM.考虑到当前的push r12(0x41 0x54)(注意到r12有偏移12),我们有:
+----------------+--------------------+
| 0x41 | 0x54 |
+----------------+--------------------+
| REX | MODRM |
+--------+-------+-----+--------+-----+
| Prefix | WRXB | mod | reg …Run Code Online (Sandbox Code Playgroud) 当我尝试创建一个返回函数Thing a(ThingGADT 在哪里)时,我目前正在与类型检查器进行斗争。一个最小的例子:
{-#LANGUAGE GADTs, EmptyDataDecls #-}
module Main where
-- Define a contrived GADT
data TFoo
data TBar
data Thing a where
Foo :: Int -> Thing TFoo
Bar :: String -> Thing TBar
combine :: [Thing a]
combine = [Foo 1, Bar "abc"]
main :: IO ()
main = undefined
Run Code Online (Sandbox Code Playgroud)
a类型检查器对不匹配感到不高兴TBar。想必这是因为它已经推断出来a了TFoo。但是,这是令人惊讶的,因为使用常规求和类型,您可以执行以下操作:
data Thing = Foo Int | Bar String
combine :: [Thing]
combine = [Foo 1, Bar …Run Code Online (Sandbox Code Playgroud) 我一直在创建RESTful应用程序,并且我未决定如何处理不返回资源的所有实体或返回多个资源(GET /resource/all请求)的请求.请允许我一些时间来设置这种情况(我会尝试尽可能地概括这一点,以便它可以适用于除我之外的其他人):
假设我正在创建一个产品API.为简单起见,假设它返回JSON(在发送正确的接受标头之后).可以访问产品/product/[id].产品有评论,可以访问/products/[id]/review/[id].
我的第一个问题在于这种子资源模式.由于您在获取产品时可能并不总是想要评论,因此可以通过其他URI访问它们.根据我的内容,我应该包含请求的URI,该URI将返回产品请求响应中产品的所有审核URI.我应该如何解决这个问题,以便它遵守RESTful标准?它应该是标题,Reviews-URI: /product/123/review/all还是应该在响应正文中包含URL,如下所示:
{ 'name': 'Shamwow',
'price': '$14.99',
'reviews': '/product/123/review/all'
}
Run Code Online (Sandbox Code Playgroud)
我的第二个问题是关于/product/[id]/review/all请求应该如何运作.我听说我应该发送所有评论的URL并让用户获取每个评论,而不是将所有评论打包成一个请求.我应该如何根据RESTful标准指出这一系列的评论URI?我应该使用标头或列出响应正文中的URI,如下所示:
{ 'reviews': [ '/product/123/review/1',
'/product/123/review/2',
'/product/123/review/3'
]
}
Run Code Online (Sandbox Code Playgroud) 我需要知道"正确"执行网站导航的术语和最佳做法吗?类似于stackoverflow在你通过url提出问题时如何路由你:
"http://stackoverflow.com/questions/ask"
根据我对PHP编程的了解,我可能会像这样编写代码:
"http://stackoverflow.com/index.php?p=questions&act=ask"
希望你明白我的意思.我想知道这种页面导航和请求/响应处理方法的术语,如果可能的话,在使用此标准/方法设计Web应用程序时需要记住的最佳实践,限制或其他任何内容.我甚至不知道这是用PHP还是用ASP或Ruby编写的一些网络后端完成的,或者你有什么,所以我用猜测填充了标签.
我有 3 个odoos在使用 ubuntu16 和postgresql 9.5 的aws 中正常运行到 ec2 ,但几天前有 1 个 odoo 实例死亡,在我的日志 odoo 中我看到:
2018-01-11 06:15:56,343 28311 ERROR ? openerp.addons.bus.bus: Bus.loop error, sleep and retry
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/openerp/addons/bus/bus.py", line 136, in run
self.loop()
File "/usr/lib/python2.7/dist-packages/openerp/addons/bus/bus.py", line 122, in loop
conn.poll()
OperationalError: SSL connection has been closed unexpectedly
2018-01-11 06:15:58,283 28311 INFO ? openerp.service.server: Initiating shutdown
Run Code Online (Sandbox Code Playgroud)
在我的 postgresql 日志中,我得到:
2018-01-11 01:07:52 -05 LOG: could not receive data from client: Connection reset …Run Code Online (Sandbox Code Playgroud) 我最近问过如何制作一个GADT实例的同源列表:函数返回 GADT 的任何构造函数的结果
TL;博士
{-#LANGUAGE GADTs, EmptyDataDecls #-}
module Main where
-- Define a contrived GADT
data TFoo
data TBar
data Thing a where
Foo :: Int -> Thing TFoo
Bar :: String -> Thing TBar
data SomeThing = forall a. SomeThing (Thing a)
combine :: [SomeThing]
combine = [Something $ Foo 1, SomeThing $ Bar "abc"]
Run Code Online (Sandbox Code Playgroud)
现在,我在动态"展开"它们时遇到了一些麻烦.假设我们有这个(仍然是人为的,但更接近我的实际用例)代码:
{-#LANGUAGE GADTs, EmptyDataDecls #-}
module Main where
-- Define a contrived GADT
data Thing a where
Thing :: TKind a -> …Run Code Online (Sandbox Code Playgroud) 假设以下人为的例子:
struct Board {
squares: Vec<i32>,
}
struct Point<'a> {
board: &'a Board,
x: i32,
y: i32,
}
impl<'a> Point<'a> {
pub fn neighbors(&self) -> impl Iterator<Item = Point<'a>> {
[(0, -1), (-1, 0), (1, 0), (1, 0)]
.iter().map(|(dx, dy)| Point {
board: self.board,
x: self.x + dx,
y: self.y + dy,
})
}
}
Run Code Online (Sandbox Code Playgroud)
这不能编译,因为根据我的理解,在lambda中创建的点的生命周期是不正确的:
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
--> src/main.rs:14:25
|
14 | .iter().map(|(dx, dy)| Point {
| _________________________^
15 | | …Run Code Online (Sandbox Code Playgroud) 假设我有一些包装函数,我想做一些设置,调用回调(并保存其结果),做一些清理,然后返回回调返回的内容:
#include <functional>
#include <utility>
template<class F, typename... Args>
decltype(auto) wrap(F&& func, Args&... args) {
// Do some stuff before
auto result = std::invoke(std::forward<decltype(func)>(func),
std::forward<Args>(args)...);
// Do some stuff after
return result;
}
Run Code Online (Sandbox Code Playgroud)
一个实际的例子是一个计时器实用程序函数,它返回函数调用的经过时间及其返回值(也许在元组中).
这样的函数适用于具有返回类型的callables:
void foo() {
auto a = 1;
wrap([](auto a) { return 1; }, a);
}
Run Code Online (Sandbox Code Playgroud)
但是使用void返回类型的可调用,在模板特化期间编译器抱怨auto result具有不完整类型void:
void foo() {
auto a = 1;
wrap([](auto a) {}, a);
}
Run Code Online (Sandbox Code Playgroud)
这当然是有道理的,因为虽然你可以return void(),但你不能将它存储在一个变量中.
我想wrap为两种类型的callables工作.我试图用std::function两个签名wrap:
template<class T, …gadt ×2
haskell ×2
typing ×2
apache ×1
api ×1
assembly ×1
bind ×1
c++ ×1
c++17 ×1
closures ×1
file-upload ×1
html ×1
http ×1
intel ×1
javascript ×1
lifetime ×1
machine-code ×1
mod-rewrite ×1
node.js ×1
odoo-8 ×1
php ×1
postgresql ×1
python ×1
rest ×1
rust ×1
url-routing ×1
x86-64 ×1