Javascript StratifiedJS:如何从.js文件调用模块

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"});

我正在使用库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"});
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) { ... });