我正在使用图书馆StratifiedJS(http://onilabs.com/stratifiedjs)来构建api数据库同步。
但我对如何包含文件感到困惑。
正如文档所述,我以这种方式导入库:
<script type="text/javascript" src="js/stratified.js" main="js/index.sjs"></script>
我的index.sjs文件包含以下代码:
db = require("mongo");
var data = db.find({collection: "itens"});
模块mongo中的Thi find
方法有以下代码:
exports.find = function(params) {
waitfor(var rows) {
$.getJSON("db/find", params, function(result){
resume(result.rows);
});
}
return rows;
}
当我通过文件index.sjs或通过标签内的脚本访问db模块时:
<script type="text/sjs"> ... code .. </ script>
代码完美无缺。但是,当我尝试通过"text/javascript"
行为更改的文件进行访问时。
在这种情况下,如果我将下面的代码运行到文件.js
:
var data = db.find({collection: "itens"});
数据变量不包含从base返回的数据,因为代码return rows;
在要执行的getJSON
回调函数之前运行;
我的问题是:如何在javascript文件类型中运行sjs文件中声明的模块。
答案 0 :(得分:2)
这里的问题是普通的JS不能像分层JS那样阻塞和等待异步结果(这当然是我们首先拥有SJS的原因!)
因此,如果你有一个异步的分层函数并且你从普通的JS函数调用它,那么后者将不会“看到”分层函数的实际值,而是一种“延续”对象。
JS无法对此延续对象做任何事情,因此我们的想法是,典型的SJS程序会对调用其他分层或非分层代码的顶级代码进行分层,但是您从未(或很少)调用分层非分层代码。
如果你真的需要从'普通'非分层代码调用分层,你可以安排分层函数采用可选的回调参数:
// SJS file:
exports.find = function(params, callback) {
waitfor (var rows) { ... }
if (callback)
callback(rows);
else
return rows;
}
// called from SJS:
var data = db.find({collection:'items'});
... use data ...
// called from JS:
db.find({collection:'items'}, function(data) { ... use data ... });
或者你可以用'deferred'(https://conductance.io/reference#sjs:function::deferred)包装SJS函数,然后用JS中的回调处理结果:
// SJS file:
exports.find = function(params) { ... };
exports.deferredFind = require('sjs:function').deferred(exports.find);
// JS file:
...
db.deferredFind({collection: 'items'}).then(function(data) { ... });