从回调返回值或在 node.js 中的特定回调之外访问它?

Posted

技术标签:

【中文标题】从回调返回值或在 node.js 中的特定回调之外访问它?【英文标题】:Returning a value from callback or accessing it outside that particular callback in node.js? 【发布时间】:2014-05-13 11:28:00 【问题描述】:
//geoSpacialRepository.js

var geoSpatialRepository = ;
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/repository');

var Schema = mongoose.Schema;

var LocationSchema = new Schema(
    type: String,
    coordinates: [Number,Number]
);

var Location = mongoose.model('locations', LocationSchema);

var db = mongoose.connection;

geoSpatialRepository.find = function()
    var query = Location.find(, function(error, data));

    query.exec(function(err, data)
        console.log("DATA ************************** ");
        console.log (JSON.stringify(data));
    );


exports.geoSpatialRepository = geoSpatialRepository;

我编写 console.log 的地方 -> 我希望变量 data 退出此回调,因为我将在此上下文之外调用此函数 geoSpatialRepository.find()(例如我的测试用例)。


//TestFile geoSpacilaRepository.spec.js

var assert = require("assert");

var locationsRepository = require("../geoSpatialRepository.js").geoSpatialRepository;
var chai = require("chai"),
should = chai.should(),
expect = chai.expect,
assert = chai.assert;

describe("finding locations from the database", function()
    //setup
    var data = 
        "type":"point",
        "coordinates":[20,20]
    ;
    before(function()
        locationsRepository.save(data);
    );

    it("should find the data present in location repository",function()
        //call
        var actual = locationsRepository.find();
        //assertion
        console.log("ACTUAL ********************"+(JSON.stringify(actual)))
        expect(actual).deep.equals(data);
    );

);

【问题讨论】:

您的意思是,如果您调用geoSpatialRepository.find(),则必须返回data 是的。在那个回调之外! 【参考方案1】:

您可能需要像这样重新设计find

geoSpatialRepository.find = function(callBackFunction) 
    Location.find().exec(callBackFunction);

然后你需要像这样从测试用例中调用它

it("should find the data present in location repository", function() 
    //call
    locationsRepository.find(function(error, data) 
        console.log("ACTUAL ********************" + (JSON.stringify(actual)))
        //assertion
        expect(actual).deep.equals(data);
    );
);

现在,作为参数传递给find 的函数将得到实际的data。您可以在该函数中比较dataactual

【讨论】:

以上是关于从回调返回值或在 node.js 中的特定回调之外访问它?的主要内容,如果未能解决你的问题,请参考以下文章

在回调函数之外访问由 node.js 中的 readline 和 fs 解析的数据

Node.js:如何从回调中正确返回对象?

Node.js 中的回调地狱

Node / JS:奇怪的嵌套回调函数

从javascript中的回调函数返回值? [复制]

Node.JS:如何将变量传递给异步回调? [复制]