2014-10-30 43 views
0

如何从内部回调返回,在下面的场景中,正在返回一个json数据,当我试图做console.log时,它打印[功能]而不是JSON值如何从回调节点返回数据

exports.tests = function(tagName, out) { 

    model.findbyTag(tagName, function(data) { 

     var json = { 
      "name" : 'java', 
      "data" : "SomeData" 
     } 

     return json; 

    }); 

} 

console.log(this.tests)

它输出

[Function] 

我在做什么错,所以当这个方法执行时,它应该返回json数据

+0

你不能从一个回调 – dandavis 2014-10-30 07:59:54

+0

返回的数据有没有什么办法的时候finshed处理 – anish 2014-10-30 08:01:36

+0

肯定的是,简单地加上“执行console.log(JSON)” – dandavis 2014-10-30 08:02:04

回答

1
module.exports = function() { 

    var _return = {}; 

    _return.someName = function(tagName ,callback){ 
     model.findbyTag(tagName, function(err ,data) { 
      var json = { 
       "name" : 'java', 
       "data" : "SomeData" 
      } 
      callback(json); 
     }); 
    } 

    return _return ; 
} 

您可以在另一个文件中使用上面的代码是这样的:

var sample_file = require('above code file address'); 

sample_file.someName(someTagName , function (data) { 
    console.log(data) // this data is the json data 
}) 
+0

该代码工作完美,请@dandavis你为什么这么说? – 2014-10-30 08:14:31

+0

@ Daniel.V:因为我在编辑和修复之前讨论过代码:http://stackoverflow.com/revisions/26647812/1 – dandavis 2014-10-30 08:24:30

0

你不能从回调中返回数据,而应该将一个函数传递给可以在回调函数内部调用的方法结果。

例子:

exports.tests = function(tagName, out, returnFunction) { 

    model.findbyTag(tagName, function(data) { 

     var json = { 
      "name" : 'java', 
      "data" : "SomeData" 
     } 
     // Call the returnFunction instead of trying to return data 
     returnFunction(json); 

    }); 

} 

然后调用它像这样:

this.tests('tagName', 'out', function(r) { 
    // Where "r" is the result of the callback 
    console.log(r); 
}); 
-1

您需要如果您在t中使用Node,则使用Node发射器他当然是第一名。

const EventEmitter = require('events'); 

class MyEmitter extends EventEmitter {} 

const myEmitter = new MyEmitter(); 
myEmitter.on('event', (someProps) => { 
    console.log('an event occurred!'); 
}); 
myEmitter.emit('event', {...someProps}); 

然后,您可以访问json并调用所需的任何进一步操作。使用事件可能会使您稍微重构应用程序。 https://nodejs.org/docs/latest/api/events.html#events_emitter_on_eventname_listener

+0

欢迎提供一个解决方案的链接,但请确保您的答案没有用它:[添加链接上下文](// meta.stackexchange.com/a/8259),这样你的同行用户就会知道它是什么以及它为什么在那里,然后引用你所在页面的最相关部分链接到目标页面不可用的情况。 [仅仅是一个链接的答案可能会被删除。](// stackoverflow.com/help/deleted-answers) – paper1111 2018-02-21 02:01:10