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

时间:2014-04-03 13:11:58

标签: javascript sync stratifiedjs

我正在使用图书馆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文件中声明的模块。

1 个答案:

答案 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) { ... });