我试图找出是否有可能在递归函数中使用promise而不是标准回调。
我现在拥有的方式:
function recursive(data, cb){
(function promiseProvider(data){
return newThenable(data).then(function(val){
if(val.a){
cb(null, val);
}
else {
return promiseProvider(val);
}
});
})(data);
}
Run Code Online (Sandbox Code Playgroud)
这行得通,但是我无法弄清楚如何实现纯粹的promise实现。
也许这行得通吗?
function recursive(data){
return newThenable(data).then(function(val){
if(val.a){
return // <<< ???
}
else {
return recursive(val);
}
});
}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用。
一段时间对此感到困惑,这里是一个代表问题的精炼脚本:
#start
# note that master does not exist, so this should fail, would like to exit on the next line
git branch -D master || (echo "no master branch" && exit 1);
git fetch origin &&
git checkout master &&
BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [[ "$BRANCH" != "master" ]]; then
echo 'Aborting script because you are not on the right git branch (master).';
exit 1;
fi
echo "done"
#end
Run Code Online (Sandbox Code Playgroud)
当我运行上面的脚本时,我得到以下输出:
error: branch 'master' not found.
no master branch …Run Code Online (Sandbox Code Playgroud) 假设我在Node.js中有一个简单的缓冲区,如下所示:
const bytes = Buffer.from('abcdefg');
Run Code Online (Sandbox Code Playgroud)
这个缓冲区实例有slice和concat作为方法,但我真的不知道如何使用这些来基本上创建数组的pop/shift/splice的功能.
这里是缓冲区文档:https://nodejs.org/api/buffer.html
我基本上要做的是读取/删除前X个字节,如下所示:
function read(x){
// return the first x number of bytes from buffer
// and remove those bytes from the buffer
// side-effects be damned for the moment
}
Run Code Online (Sandbox Code Playgroud)
这就是我所拥有的,但它对我来说似乎很"错误",即使它似乎也有效:
let items = Buffer.from('abcdefg');
function read(x){
const b = items.slice(0,x);
items = items.slice(x,items.length);
return b;
}
console.log(String(read(4)));
console.log(String(items));
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
另外,我不确定读取是否是正确的单词,但pop会意味着一个数组...使用描述这个函数的功能是什么?
我有这个Webpack配置:
const path = require('path');
module.exports = {
entry: ['babel-polyfill', './lib/index.js'],
output: {
path: path.resolve(__dirname + '/dist'),
filename: 'suman.js'
},
module: {
loaders: [
{
test: /\.js$/,
loader: 'babel-loader',
options: {
presets: ['latest'],
plugins: ['transform-runtime']
}
}
]
},
node: {
assert: 'empty',
buffer: 'mock',
child_process: 'empty',
cluster: 'empty',
console: 'mock',
constants: 'empty',
crypto: 'empty',
dgram: 'empty',
dns: 'mock',
domain: 'empty',
events: 'empty',
fs: 'empty',
http: 'empty',
https: 'empty',
module: 'empty',
net: 'mock',
os: 'empty',
path: 'empty',
process: 'mock',
punycode: …Run Code Online (Sandbox Code Playgroud) 我从TS中收到此错误:
很清楚为什么会发生错误:
function outer(){
if (true) {
function inner(){ // nested function declaration
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是我的问题是-为什么TS会抱怨这一点-在转换为ES5时应该避免一些技术原因,以避免嵌套函数声明吗?
函数表达式会是一个更好的选择,为什么?
我想在一个容器中运行MongoDB,这有效:
docker run -p 27017:27017 --name cdt -d mongo
Run Code Online (Sandbox Code Playgroud)
然后我想在另一个容器中运行服务器,如下所示:
docker run --name foo --link cdt:mongo exec /bin/bash -c "node server.js"
Run Code Online (Sandbox Code Playgroud)
node.js服务器尝试与mongodb建立连接localhost:27017,但无法建立连接.
有人知道为什么会这样吗?我没有正确连接容器吗?
请注意,我可以从容器外部成功连接到mongodb容器,但不能从"foo"容器内的服务器连接.
所以我有这个bash命令:
sqlite3 ${SUMAN_DATABASE_PATH} "CREATE TABLE suman_run_info (run_id INTEGER, suman_id INTEGER, suite_id INTEGER, test_id INTEGER,
name TEXT, value TEXT);" >> ${SUMAN_DEBUG_LOG_PATH}
Run Code Online (Sandbox Code Playgroud)
我想在我的编辑器中手动包装它.但是因为它主要是一个字符串,所以我似乎无法使用\字符包装它.
阿卡,这真的不会起作用,tmk:
sqlite3 ${SUMAN_DATABASE_PATH} "CREATE TABLE suman_run_info \ (run_id INTEGER, suman_id INTEGER, suite_id INTEGER, test_id INTEGER,
name TEXT, value TEXT);" >> ${SUMAN_DEBUG_LOG_PATH}
Run Code Online (Sandbox Code Playgroud)
如何包装此bash命令以使其适合100列或其他任何内容?
我正在寻找这样的东西:
sqlite3 ${SUMAN_DATABASE_PATH} "CREATE TABLE suman_run_info (run_id INTEGER,
suman_id INTEGER, suite_id INTEGER, test_id INTEGER,
name TEXT, value TEXT);" >> ${SUMAN_DEBUG_LOG_PATH}
Run Code Online (Sandbox Code Playgroud)
我已经读过相邻的字符串应该自动连接,所以这可能有用吗?
sqlite3 ${SUMAN_DATABASE_PATH} "CREATE TABLE suman_run_info"
"(run_id INTEGER, suman_id INTEGER, suite_id INTEGER, test_id INTEGER,"
"name TEXT, value …Run Code Online (Sandbox Code Playgroud) 我们使用查询字符串中包含大量数据的HTTP GET请求来表示要检索的集合的所有ID。
关于网址中查询字符串长度的限制,谷歌快速搜索显示:
RFC 3986也声明没有限制,但是由于DNS限制,主机名限制为255个字符(第2.3.3节)。Microsoft说,Internet Explorer中URL的最大长度为2,083个字符,URL的路径部分最多不超过2,048个字符。2009年5月1日
如果我们不使用IE,我是否应该担心可能超出查询字符串长度的限制?我确定我已经在Node.js Express服务器上看到了超出的限制,特别是当我在GET请求的查询字符串中包含表示图像的base64字符串时。
解决这个问题的好方法是什么?我们应该只使用HTTP POST请求吗?当然,我们不想为了避免此问题而将1个GET请求分解为1000个。
我有这种情况,我想在对象解构中多次使用相同的变量名:
let {body, response} = await requestp('get', `${cdtAPIUrl}/whitelist`, headers);
let parsedBody = await siamese.parse(body);
assert(parsedBody.success, 'response body should have a success property.');
assert(parsedBody.success.length === usernames.length, 'wrong number of items in response body array.');
let {body, response} = await requestp('get', `${cdtAPIUrl}/caches/whitelist`, headers);
let parsedBody = await siamese.parse(body);
Run Code Online (Sandbox Code Playgroud)
但是当我用 node 运行脚本时,node 会在运行前抱怨:
SyntaxError: Identifier 'body' has already been declared
Run Code Online (Sandbox Code Playgroud)
有两个问题使我无法获得简单的解决方案:
我不能用对象解构来做到这一点:
let {a,b} = c;
{a,b} = c; // not allowed
我无法重命名bodyor response,因为这是调用返回的内容。
我该怎么办?
也许最好的做法是这样的:
let {body,response} = ... …Run Code Online (Sandbox Code Playgroud) 我们有一个远程MongoDB服务器,我们在本地开发人员的机器上有mongodump数据.使用本地数据恢复远程MongoDB服务器数据的最佳方法是什么?我们可以使用mongo命令吗?
javascript ×5
node.js ×4
bash ×2
mongodb ×2
babel-loader ×1
babeljs ×1
buffer ×1
docker ×1
docker-link ×1
ecmascript-5 ×1
es6-promise ×1
get ×1
git ×1
http ×1
promise ×1
query-string ×1
recursion ×1
scp ×1
sh ×1
shell ×1
typescript ×1
url ×1
web ×1
webpack-2 ×1