JavaScript 承诺和 Node.js

JavaScript promise and 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/');

我只需要将结果添加到响应中,但我发现我无法从 then function 内部访问 res 变量,而且我不能简单地将结果分配给变量就像前面的示例一样,因为该块是异步执行的,所以当我尝试在外部使用它时,它只是空的。

您 运行 遇到异步问题,您需要从 then()

中调用 res.end(result)
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

的命名冲突