mysqli::store_result()和之间有什么区别mysqli::use_result()?
PHP.net上的文档似乎对两者之间的差异非常模糊.该mysqli::use_result()-page不提供任何代码样本,您链接到mysqli::multi_query()页随机寻找他们.在该页面中,给出了以下代码示例(请参阅完整代码页面):
/* store first result set */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
$result->free();
}
/* print divider */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
Run Code Online (Sandbox Code Playgroud)
该mysqli::store_result()-page使用完全相同相同的代码样本,但有一个例外:
/* store first result set */
if ($result = $mysqli->use_result()) {
Run Code Online (Sandbox Code Playgroud)
是的...... store_result成了use_result.请注意,即使上面的评论仍然说"商店".
看过代码示例后,我想; "好吧,所以这是别名".可是等等!该文档提供了以下描述:
它们看起来像两个不同的东西,根本不像别名.仔细看看我发现mysqli::use_result()-page 的代码示例中还有另一个例外:$result->free();成了$result->close();.然而,当我发现在第二个代码示例(程序等效)中的同一页上使用时,我发现真相的希望很快就被破坏了 …
这个问题旨在最终解决我在与Bluebird开发中遇到的问题.但是,我也利用这个机会澄清了一些事情,所以会有副问题.我也提前道歉,因为在阅读未来的故事时你可能会遇到任何混乱或无聊的感觉.
据我所知,Bluebird试图根据以下策略智能地捕捉被忽略的拒绝:
第二种方法,即bluebird默认采用的方法是,如果在第二轮开始时未处理拒绝,则调用已注册的处理程序.- Bluebird自述文件#错误处理
现在,这是第一个侧面问题:"第二轮的开始"是什么意思?
稍后在同一部分中,记录以下内容:
当然这并不完美,如果你的代码出于某种原因需要突然进入并将错误处理程序附加到某些承诺之后,承诺已经暂停了一段时间,那么你会看到恼人的消息.在这种情况下,您可以使用.done()方法来表示应该抛出任何挂起的异常.- Bluebird自述文件#错误处理
现在,我相信我遇到了上述情况,我的用例如下:
我打电话给一个函数,它将为我提供我附加的承诺.catch():
lib.loadUrls()
.catch(function(e){console.log(e);});
Run Code Online (Sandbox Code Playgroud)在内部,该函数从URL1加载内容,并根据内容,按顺序从URL2加载内容:
lib.loadUrls =
return this.loadUrl1()
.then(this.loadUrl2.bind(this))
Run Code Online (Sandbox Code Playgroud)如果此链中的第二个promise被拒绝,则首先由catch处理错误,然后由Bluebirds Possibly unhandled error处理程序处理.
这最后一个行为是不需要的,我无法弄清楚它为什么这样做.问题二可能是:为什么,尽管附加并执行了错误处理程序,Bluebird仍然会考虑错误被"未处理"的可能性?
我在想,显然这个承诺"在拒绝传播到传播之前已经停留了一段时间" .catch().在这种情况下,我应该通过"使用.done()" 来解决它(根据引用的文档).
现在,我已经尝试了几件事,但在这种情况下我无法弄清楚如何"使用.done".(.done()返回undefined 没有帮助,阻止我进行操作.finally.)
所以这引入了我的第三个和第四个问题:我如何.done()在这种情况下使用,以及如何明确地结束一个承诺链,但仍然附加一个.finally()
编辑1:我创建了一些JSFiddles来重现错误:
编辑2:开发人员修复了错误.
你好.在我看来,这是一个奇怪的问题,我对此感到茫然:
让我们来:
tags = [ ObjectId('a'), ObjectId('b') ]
search = { $search: 'abc' }
Run Code Online (Sandbox Code Playgroud)
现在以下查询工作正常:
db.entries.find({ $or: [ {$text:search} ] })
Run Code Online (Sandbox Code Playgroud)
还有这个:
db.entries.find({ $or: [ {tags:{$in:tags}} ] })
Run Code Online (Sandbox Code Playgroud)
但结合它们:
db.entries.find({ $or: [ {$text:search}, {tags:{$in:tags}} ] })
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Unable to execute query: error processing query: ns=db.entries
Tree:
$or
tags $in [ ObjectId('a'), ObjectId('b') ]
TEXT : query=abc, language=, tag=NULL
Sort: {}
Proj: {}
No query solutions
Run Code Online (Sandbox Code Playgroud)
2.6.4.{_id:"c"}表达式组合就可以正常工作.$or-array中的顺序不会影响结果.救命?:(
我正在使用Bluebird做异步操作,但现在必须做很多空/空/错误检查,我不想按照通常的Else路线.我正在考虑使用monad,但尚未彻底完成它.
此外,我希望它能与ramda一起使用,pipe / compose因为我的大多数其他代码都整齐地封装在功能管道中.根据许多 讨论,monadic Futures(Fluture似乎被推荐)比Promises更受欢迎,对pipeP的支持和composeP可能在未来版本中被删除.
Fluture似乎是一个不错的选择,因为据说它可以很好地适应那些坚持幻想 - 土地规格的图书馆(如ramda).
但是我完全迷失了如何实现将Ramda的管道与Fluture集成在一起的东西.我需要一些示例代码的帮助.
例如:
我有一个DB调用,返回一个对象数组.数组可能具有值,为空或未定义.我有一个功能管道,可以转换数据并将其返回到前端.
示例承诺代码:
fancyDBCall1(constraints)
.then(data => {
if (!data || data.length === 0) {
return []
}
return pipe(
...
transformation functions
...
)(data)
})
.then(res.ok)
.catch(res.serverError)
Run Code Online (Sandbox Code Playgroud)
有人可以就一个好的方法提出一些指示.
鉴于以下npm list输出片段:
...
??? glob@6.0.2 invalid
? ??? inflight@1.0.4
? ? ??? wrappy@1.0.1
? ??? inherits@2.0.1
? ??? minimatch@2.0.10
? ??? once@1.3.3
...
Run Code Online (Sandbox Code Playgroud)
我问自己:“无效是什么意思?” 但是,我可以在有关它的文档中找到以下内容:
[npm list] 将打印出无关的、丢失的和无效的包。--来源
......所以现在我问你。
我有一个这样的管子
const asyncFn = (x) => {
return Future.tryP(() => Promise.resolve(x + ' str2'))
};
const pipeResult = S.pipe([
x => S.Right(x + " str1"), // some validation function
S.map(asyncFn),
])("X");
pipeResult.fork(console.error, console.log);
Run Code Online (Sandbox Code Playgroud)
我想在asyncFn. 问题是当我有Right输入时,我可以再分叉它。
当我登录时,pipeResult我看到:
Right (tryP(() => Promise.resolve(x + ' str2')))
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?