无法弄清楚如何在节点.js中使用同步.js

Can't figure out how to use synchronize.js in node.js

本文关键字:js 同步 节点 弄清楚      更新时间:2023-09-26

我正在尝试在我的节点.js应用程序中使用模块同步.js,但我失败了。 函数仍然无序运行,我无法获取数据。这是我代码的一般片段。

// an object with devices to migrate
var devices2Migrate =
{
device_array: [],
init: function ( done )
{
    sync.fiber(function()
    {
      //do init stuff
      console.log( 'yay we have a DB connector' );
      DB1.connect(function(err)
      {
          console.log( 'Database 1 is connected ...' );
      }
      DB2.connect(function(err)
      {
          console.log( 'Database 2 is connected ...' );
      }
    }, done);
 },
 loadDevices2Migrate: function ( done )
 {
    var self = this;
    sync.fiber(function()
    {
       //get stuff from DB using query()
    }, done);
 }
}; //end of object
// load up all the data for the devices using the old style tables
    sync.fiber(function(){
        sync.await( devices2Migrate.init( sync.defer() ));
        sync.await( devices2Migrate.loadDevices2Migrate( sync.defer() ) );
        console.log(  devices2Migrate.device_array );
        console.log(  "size: " + devices2Migrate.device_array.length );
    });

但是发生的情况是控制台.log显示函数没有等待:

yay we have a DB connector
[]
size: 0
Database 1 is connected ...
Database 2 is connected ...

谁能指出我做错了什么? 如果需要,我可以更多地填写方法主体,起初我只是想保持简单。我知道我的方法(函数)是正确的,因为如果我将底部控制台.log调用(光纤中的调用)包装在 setTimeout 回调中,那么我确实会得到我的数据。

我最终使用了async.js包。 它更"用户友好",因为它有效!

编辑:异步,我这样做了:

// load up all the data for the devices using the old style tables
async.series(
    devices2Migrate.init( callback ),
    devices2Migrate.loadDevices2Migrate( callback )
){
    // land here when done
    console.log(  devices2Migrate.device_array );
    console.log(  "size: " + devices2Migrate.device_array.length );
});

在使用 Node 时,这是我最喜欢的承诺包:

简单的承诺:

return when.promise(function(resolveCallback, rejectCallback) {
        //do something here
    var blah = foo("bar");
    //return callback like this
    resolveCallback();
});

链式承诺:

return when.promise(function(resolveCallback, rejectCallback) { 在这里做点什么 var blah = foo("bar");

//return callback like this
resolveCallback();

}).then(x);

var x = function(){
     return when.promise(function(resolveCallback, rejectCallback) {
      //do something here
      var blah = foo("bar");
      //return callback like this
      resolveCallback();
        });
};