2014-04-03 57 views
2

我正在使用StratifiedJS庫(http://onilabs.com/stratifiedjs)構造一個api數據庫同步。StratifiedJS:如何從.js文件調用模塊

但我對如何包含文件感到困惑。

由於文件說,我導入庫是這樣的:

<script type="text/javascript" src="js/stratified.js" main="js/index.sjs"></script> 

我index.sjs文件中有這樣的代碼:

db = require("mongo"); 
var data = db.find({collection: "itens"}); 

在模塊蒙戈氏find方法有以下代碼:

exports.find = function(params) { 

    waitfor(var rows) { 
     $.getJSON("db/find", params, function(result){  
      resume(result.rows); 
     }); 
    } 

    return rows; 
} 

當我通過文件index.sjs或腳本訪問數據庫模塊時

<script type="text/sjs"> ... code .. </ script>

代碼完美的作品:一個標籤內。但是當我嘗試通過"text/javascript"類型的文件訪問行爲更改時。

在這種情況下,如果我運行下面的代碼到一個文件.js

var data = db.find({collection: "itens"}); 

要執行的數據變量的getJSON回調函數之前將不包含來自基站返回的數據,東陽代碼return rows;運行;

我的問題是:如何運行javascript文件類型中的sjs文件中聲明的模塊。

回答

2

這裏的問題是正常的JS不能阻止,等待在分層以同樣的方式異步結果JS可以(當然這是爲什麼我們在第一時間有SJS的原因!)

所以,當你有一個分層函數,它執行異步的事情,並且你從一個普通的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 ... }); 

或者你可以用與 '遞延'(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) { ... }); 
+0

感謝您的解釋.... –