JavaScript обещание и Node.js - PullRequest
       8

JavaScript обещание и Node.js

1 голос
/ 14 апреля 2020

У меня есть простой Node.js сервер, на котором я пытаюсь использовать Node.js пакет с именем image -ходимость , в соответствии с его do c он используется так:

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 из тогдашнего function, и я не могу просто присвоить результат переменной, как в предыдущем примере, так как этот блок выполняется асинхронно, он просто будет пустым, когда я попытаюсь использовать его снаружи.

1 Ответ

2 голосов
/ 14 апреля 2020

У вас проблемы с асинхронностью c, вам нужно позвонить 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...