Javascript StratifiedJS:如何从.js文件调用模块
我正在使用库StratifiedJS()构建一个api数据库 但我对如何包含文件感到困惑 正如文档所述,我通过以下方式导入库:Javascript StratifiedJS:如何从.js文件调用模块,javascript,sync,stratifiedjs,Javascript,Sync,Stratifiedjs,我正在使用库StratifiedJS()构建一个api数据库 但我对如何包含文件感到困惑 正如文档所述,我通过以下方式导入库: <script type="text/javascript" src="js/stratified.js" main="js/index.sjs"></script> mongo模块中的find方法具有以下代码: db = require("mongo"); var data = db.find({collection: "itens"});
<script type="text/javascript" src="js/stratified.js" main="js/index.sjs"></script>
mongo模块中的find
方法具有以下代码:
db = require("mongo");
var data = db.find({collection: "itens"});
exports.find = function(params) {
waitfor(var rows) {
$.getJSON("db/find", params, function(result){
resume(result.rows);
});
}
return rows;
}
当我通过index.sjs文件或通过标记内的脚本访问db模块时:
。。。代码代码>
代码工作得很好。但是当我试图通过类型为“text/javascript”
的文件进行访问时,行为会发生变化
在本例中,如果我将下面的代码运行到文件.js
:
var data = db.find({collection: "itens"});
数据变量将不包含从base返回的数据,因为代码返回行
在要执行的getJSON
回调函数之前运行
我的问题是:然后如何以javascript文件类型运行sjs文件中声明的模块。这里的问题是,普通JS不能像分层JS那样阻止和等待异步结果(这当然是我们首先使用sjs的原因!)
因此,当你有一个执行异步操作的分层函数,并且你从一个普通的JS函数调用它时,后者将不会“看到”分层函数的实际值,而是一种“延续”对象
JS实际上无法对这个continuation对象执行任何操作,因此,我们的想法是,典型的SJS程序将具有分层顶层代码,这些代码调用其他分层或非分层代码,但您从未(或很少)调用非分层代码中的分层代码
如果确实需要从“普通”非分层代码调用分层,可以安排分层函数采用可选的回调参数:
// SJS file:
exports.find = function(params, callback) {
waitfor (var rows) { ... }
if (callback)
callback(rows);
else
return rows;
}
或者,您可以使用'deferred'()包装SJS函数,然后使用JS中的回调处理结果:
// SJS file:
exports.find = function(params) { ... };
exports.deferredFind = require('sjs:function').deferred(exports.find);
// called from JS:
db.find({collection:'items'}, function(data) { ... use data ... });
// SJS file:
exports.find = function(params) { ... };
exports.deferredFind = require('sjs:function').deferred(exports.find);
// JS file:
...
db.deferredFind({collection: 'items'}).then(function(data) { ... });