Javascript 路由器应用程序的回调未调用Node.Js

Javascript 路由器应用程序的回调未调用Node.Js,javascript,node.js,callback,Javascript,Node.js,Callback,我现在的代码是 resizer.resize(filepath, parsedUrl, fullDestinationPath, function() { return self.send(response, 200, {'Content-Type': mime.lookup(fullDestinationPath)}, fs.createReadStream(fullDestinationPath)); }); “调整大小”将运行到 Resizer.prototype

我现在的代码是

resizer.resize(filepath, parsedUrl, fullDestinationPath, function() {
        return self.send(response, 200, {'Content-Type': mime.lookup(fullDestinationPath)}, fs.createReadStream(fullDestinationPath));
    });
“调整大小”将运行到

Resizer.prototype.resize = function (filepath, parsedUrl, fullDestinationPath) {
         this.read(filepath, parsedUrl, fullDestinationPath);
};
这就叫

Resizer.prototype.read = function(filepath, parsedUrl, fullDestinationPath){ 
    something.then(function (somethingElse) {
      // Not relevant for question
   }).catch(function (err) {
       console.error(err);
   });
};
我有一个
console.log(1)
之后。请阅读第二个代码段中的
,以确保它完全在其中运行。但回到我的第一个代码片段,它不会调用我的回调。我使用回调的原因是,如果我不这样做,发送将在文件完全保存之前执行,除非它是一个非常小的文件,所以
self.send
需要在
.resize
之后调用,这就是我尝试使用回调的原因

我尝试过多种方法,认为语法错误可能是问题所在,或者它挂在某个位置上,但我已经验证了它不是问题所在,它只是不调用回调。我犯了什么明显的错误吗?我如何让它调用回调

我阅读过类似的问题/答案,了解它是如何工作的,并以同样的方式实施它,但它对我不起作用,我不明白为什么。感谢您花时间通读这篇文章

编辑:在修复了Roberts answer的问题后,我删除了回调,并将代码更改为此,我使用承诺而不是回调: 片段1:

resizer
        .resize(filepath, parsedUrl, fullDestinationPath)
        .then(function() {
            return self.send(response, 200, {'Content-Type': mime.lookup(fullDestinationPath)}, fs.createReadStream(fullDestinationPath));
        });
片段2:

Resizer.prototype.resize = function (filepath, parsedUrl, fullDestinationPath) {
   return this.read(filepath, parsedUrl, fullDestinationPath);
};
片段3:

Resizer.prototype.read = function(filepath, parsedUrl, fullDestinationPath){
    return Jimp.read(filepath)
        .then(function() {
            return //tons of irrelevant code
         })
        .catch(function (err) {
            console.error(err);
        });
};

Resizer.prototype.resize
一开始不使用回调参数,因此即使您从主代码中传递了一个回调参数,也没有做任何处理

this.read()也是如此:它也没有回调参数

试试这个:

Resizer.prototype.resize = function (filepath, parsedUrl, fullDestinationPath, callback) {
  this.read(filepath, parsedUrl, fullDestinationPath, callback);
};
以及:


我没有看到任何回调被传递给或被调整大小函数使用。return self.send部分是没有被调用的部分。你不把这叫做回叫吗?我还使用console.log验证了它正在运行所有代码,并且没有挂起在任何地方,只是没有返回。自我只是一个变量自我=这个;在代码的上半部分,因为当我在它周围放置另一个函数时,它的含义会发生变化。
self.send()
是匿名函数定义中的一个命令,您可以将它作为参数传递给
resize
,但正如这里提到的,
resize
不接受其参数列表中的回调(它只接受filepath、parsedUrl和fullDestinationPath)谢谢,它现在可以工作了,我没有意识到我必须将回调作为参数传递,我必须稍微编辑一下你的第二个代码片段才能工作,我将编辑我在主要帖子中使用的代码。回调没有什么特别的,它们只是在操作完成后传递和调用的函数:DThanks I't现在不要忘记如何正确使用回调。我在一次编辑中添加了我最终得到的代码,这是解决问题的正确方法吗?@Strahbery是的,看起来不错,尽管你现在使用的是承诺而不是回调。这很好,事实上,这将允许你完全删除
回调
参数(承诺是处理异步代码的另一种方式,是回调的替代方法)。
Resizer.prototype.read = function(filepath, parsedUrl, fullDestinationPath, callback){ 
  something.then(function (somethingElse) {
    callback(null, somethingElse); 
  }).catch(function (err) {
    console.error(err);
    callback(err);
  });
};