javascript - JavaScript 承诺和 Node.js
问题描述
我有一个简单的 Node.js 服务器,我正在尝试使用一个名为image-similarity的 Node.js 包,根据它的文档,它的使用方式如下:
let imageSimilarity = require ('image-similarity') ;
imageSimilarity('./image/1.jpg', './image/2.jpg').then ( res => {
console.log(res) ; // The similarity is 0.8162515507509954
} ) ;
它可以正常工作,但我试图在 HTTP Node.js 服务器中使用它,如下所示:
var http = require('http');
var imageSimilarity = require('image-similarity');
http.createServer(function handler(req, res) {
res.writeHead(200, {'Content-Type' : 'text/plain'});
var result = "";
imageSimilarity('./images/1.png', './images/2.png').then(res => {
result = res;
});
res.end(result);
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
我只需要将结果添加到响应中,但我发现我无法res
从 then 内部访问变量function
,并且我不能像上一个示例中那样简单地将结果分配给变量,因为该块是异步执行的,它只会是当我尝试在外面使用它时是空的。
解决方案
你遇到了异步的问题,你需要res.end(result)
从你的内部调用then()
var http = require('http');
var imageSimilarity = require('image-similarity');
http.createServer(function handler(req, res) {
res.writeHead(200, {'Content-Type' : 'text/plain'});
imageSimilarity('./images/1.png', './images/2.png').then(result => {
res.end(result);
});
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
我还注意到我重命名了then
' 参数result
以避免与外部命名冲突res
推荐阅读
- networking - 交换机如何区分 vlan untagged 和 802.1Q vlan tagged 帧?
- c# - 过程或函数“Registration_proc1”需要参数“@p_fullname”,但未提供该参数
- jq - 如何使用 jq 在 JSON 数组中多次复制现有对象?
- javascript - 如何仅触发浏览器选项卡关闭事件?
- javascript - 资产中用户文件夹的 Src 图像 - React
- android - 如何通过 Xamarin 中的 App 上传和设置图像
- javascript - 可以访问在不同局部范围内声明的变量吗?
- github - Github 多个分支/开发者
- sql - 用数据外推表
- ngxs - 在 switchMap 中调度 ngxs 操作忽略返回值