- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 Node 的 promisify() 函数中发现了一个奇怪的行为,我无法弄清楚为什么它正在做它正在做的事情。
考虑以下脚本:
#!/usr/bin/env node
/**
* Module dependencies.
*/
var http = require('http')
var promisify = require('util').promisify
;(async () => {
try {
// UNCOMMENT THIS, AND NODE WILL QUIT
// var f = function () { return 'Straight value' }
// var fP = promisify(f)
// await fP()
/**
* Create HTTP server.
*/
var server = http.createServer()
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(3000)
server.on('error', (e) => { console.log('Error:', e); process.exit() })
server.on('listening', () => { console.log('Listening') })
} catch (e) {
console.log('ERROR:', e)
}
})()
console.log('OUT OF THE ASYNC FUNCTION')
这是一个启动 Node 服务器的简单自调用函数。这很好。
现在...如果您取消注释“UNCOMMENT THIS”下的行, Node 将退出而不运行服务器。
我知道我在一个函数上使用 promisify(),该函数不调用回调,而是返回一个值。所以,我知道这本身就是一个问题。
但是...为什么 Node 刚刚退出...?
这真的很难调试——尤其是当你有比小脚本更复杂的东西时。
如果您将函数定义更改为实际调用回调的内容:
var f = function (cb) { setTimeout( () => { return cb( null, 'Straight value') }, 2000) }
一切都按预期进行......
更新
巨大的简化:
function f () {
return new Promise(resolve => {
console.log('AH')
})
}
f().then(() => {
console.log('Will this happen...?')
})
只会打印“AH”!
最佳答案
Call promisify() on a non-callback function: “interesting” results in node. Why?
因为你允许 node.js 无事可做地进入事件循环。由于没有正在运行的实时异步操作,也没有更多代码要运行,node.js 意识到没有其他事情可做,也没有其他任何事情可以运行,所以它退出了。
当您点击 await
并且 node.js 返回到事件循环时,没有任何东西让 node.js 继续运行,因此它退出。没有计时器或打开的套接字或任何保持 node.js 运行的类型,因此 node.js 自动退出检测逻辑说没有其他事情可做,所以它退出。
因为 node.js 是一个事件驱动系统,如果您的代码返回到事件循环并且没有任何类型的异步操作在运行(打开套接字、监听服务器、计时器、文件 I/O 操作、其他硬件听众等...),那么就没有任何运行可以在事件队列中插入任何事件,并且队列当前为空。因此,node.js 意识到再也没有任何方法可以在此应用程序中运行更多代码,因此它会退出。这是 node.js 中内置的自动行为。
fp()
内部的真正异步操作将有某种套接字或计时器或保持进程运行的打开状态。但是因为你的是假的,那里没有任何东西,也没有任何东西可以让 node.js 运行。
如果在 f()
中放置 1 秒的 setTimeout()
,您将看到进程在 1 秒后退出。因此,进程退出与 promise 无关。这与您已经回到事件循环这一事实有关,但您还没有开始任何可以保持 node.js 运行的东西。
或者,如果您将 setInterval()
放在异步函数的顶部,您同样会发现该进程不会退出。
因此,如果您这样做,同样会发生这种情况:
var f = function () { return 'Straight value' }
var fP = promisify(f);
fP().then(() => {
// start your server here
});
或者这个:
function f() {
return new Promise(resolve => {
// do nothing here
});
}
f().then(() => {
// start your server here
});
问题不在于 promisify()
操作。这是因为您正在等待一个不存在的异步操作,因此 node.js 无事可做,并且它注意到无事可做,因此它会自动退出。使用 .then()
处理程序公开 promise 并不能保证 node.js 运行。相反,需要一些事件的异步操作(计时器、网络套接字、监听服务器、正在进行的文件 I/O 操作等)来保持 node.js 运行。
在这种特殊情况下,node.js 基本上是正确的。你的 promise 永远不会解决,没有其他任何东西排队等待运行,因此你的服务器永远不会启动,你的应用程序中的任何其他代码都不会运行,因此继续运行实际上没有用。您无事可做,也没有办法让您的代码实际执行任何其他操作。
If you change the function definition to something that actually calls a callback:
那是因为您使用了计时器,所以 node.js 在等待 promise 解决时实际上有一些事情要做。未调用 .unref()
的正在运行的计时器将阻止自动退出。
值得一读:How does a node.js process know when to stop?
仅供引用,您可以“关闭”或“绕过”node.js 自动退出逻辑,只需在您的启动代码中的任何位置添加:
// timer that fires once per day
let foreverInterval = setInterval(() => {
// do nothing
}, 1000 * 60 * 60 * 24);
这总是让 node.js 有事可做,因此它永远不会自动退出。然后,当您确实希望进程退出时,您可以调用 clearInterval(foreverInterval)
或使用 process.exit(0)
强制执行。
关于node.js - 在非回调函数 : "interesting" results in node. 上调用 promisify() 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49062977/
这个苹果Doc包含以下信息。 Note: Focus point of interest and exposure point of interest are mutually exclusive,
意图:该程序要求用户提供其银行帐户中当前的金额、年利率和年数。输出是金额的开始和结束,显示用户指定年份的累计利息。 问题:我正在尝试找到一种正确添加利息的方法,截至目前,在指定的年份里,我所做的就是乘
我正在尝试编写一个摊销计算器,用户可以在其中输入余额值、小数形式的利率值以及每月付款值。有了这些信息,我想输出以美元计的利息金额、本金金额和新余额。这是我的代码: import java.util.S
我有一个从政府成绩单数据库中删除的大约 18,000 个唯一单词的列表,我希望可以在网络应用程序中搜索这些单词。问题:此 Web 应用程序必须是客户端。 (允许使用 AJAX。) 所有的原始成绩单都在
这是在现实世界中出现的,我想我会分享它,因为它可能会导致一些有趣的解决方案。本质上,该算法需要区分两个列表,但让我给你一个更严格的问题定义。 数学公式 假设您有两个列表,L 和 R,每个列表都包含来自
我正在分析句子。我想知道每个句子的相关内容,松散地定义为与语料库其余部分相关的“半独特词”。类似于亚马逊的“统计上不可能的短语”,它似乎(经常)通过古怪的词串传达一本书的特征。 我的第一步是开始制作常
请告诉我为什么以下程序的输出如下所示。我没有得到 C++ 中的虚拟类。观察下面的代码: class B { public: B(char c = 'a') : m_c(c) {} public
我有一些数据(X 射线衍射)如下所示: 我想对这个数据集进行高斯拟合,以获得“更宽”部分的 FWHM。 7 度左右的双峰不是重要信息,来自不需要的来源。 为了让自己更清楚,我想要这样的东西(我用油漆画
我已经实现了一个描述的算法 here突出照片中最有趣的部分,但它的性能不是很好,而且我不确定它是否能像其他人一样做得好。我想尝试实现一个更好的,但我实际上并不了解足够的图像处理来开始。 坦白说,我什至
我有一个相当复杂的字典,我想将其转换为 JSON 对象。 dataj = json.dumps(post_data) 我收到以下错误: TypeError: 6 is not JSON seriali
我为一个执行单利和复利计算的学术项目编写了一个程序。我遇到的问题是,如果数字没有除零以外的其他东西作为“美分”(即,它不显示小数点——如果金额是例如 1750.00,它将显示高达 1750),尽管我在
我正在用 Java 编写一个利息计算器。该程序提示用户输入,并使用该输入计算特定银行帐户(支票、储蓄或 CD)的利息。 这就是我的程序的要点,而且非常简单。但是现在我对 return 语句在 crea
我目前正在从头开始学习Express JS。我的目标是精通 Node 和 Express。 在尝试在线一些示例时,我遇到了这个有趣的场景。我正在构建简单的http 服务器。代码如下。 var expr
关于opencv和c++中的meanShift算法的一个非常基本的问题!我不清楚在哪个区域进行搜索和相应的转换。我的意思是:我实现了一个非常基本的例子我为 meanShift 函数提供了以下 3 个参
在 iphone 中,我想计算从相机到拍摄对象的距离。 我在想,也许 iphone 相机的“主动自动对焦”可以提供我到拍摄对象(兴趣点)的距离?? 非常感谢。 附注伙计们,如果你认为这是不可能的,请告
我想在我的单元测试中使用 gmock。我写了一个非常简单的例子,但它失败了。 ISymbolTable 是我要模拟的接口(interface)。 MockSymbolTable 是模拟对象。在测试中,
给定: #include "gmock/gmock.h" #include using namespace testing; // tsk, tsk // -- -- -- -- -- -- --
这个问题在这里已经有了答案: Array Foreach Loop Prints Last Item Only [closed] (4 个答案) 关闭 1 年前。 在 foreach 循环之后无意中
我需要允许旅行者使用谷歌地图绘制路线,然后查询我的兴趣点数据库(比如说,麦当劳的位置),然后显示所有这些位置在一两英里内的路线。服用。问题是,我如何有效地获取从谷歌返回的“行车路线”信息(本质上是一组
我见过很多类似的问题,但无法适应我的情况。我有嵌套列表形式的数据,想以某种方式将其转换为数据框。 my_data_object
我是一名优秀的程序员,十分优秀!