如何使用npm synchronize在node.js中的变量中返回回调

时间:2015-10-26 21:49:09

标签: node.js synchronized

我正在使用nodejs,我想避免多个嵌套回调。我如何使用synchonize来做到这一点? 更准确地说,如何从变量中的请求回调中返回pubkeysObj并在脚本的其余部分中使用它?

var sync = require('synchronize');
var fiber = sync.fiber;
var await = sync.await;
var defer = sync.defer;

try {
    fiber(function() {
        console.log('before findKeyPair');
        var pubkeysObj2 = await( findKeyPair( defer() ) );
        console.log('after findKeyPair pubkeysObj2: ' + pubkeysObj2);

        console.log('before makeKeyPairs');
        var pubkeyArray2 = await( makeKeyPairs( pubkeysObj2, defer() ) );
        console.log('after makeKeyPairs pubkeyArray2: ' + pubkeyArray2);
    });
} catch(err) {
    console.log('err: ' + err);
}

function findKeyPair(){
   Keypair.find({}, {pubkey: 1, _id: 0}, function(err, pubkeysObj) { //mongoose db
      if (err) res.redirect('/');
      console.log('inside findKeyPair pubkeysObj: ' + pubkeysObj);
      return pubkeysObj;   // ?????????
   });
}

function makeKeyPairs(pubkeysObj3){
   console.log('inside makeKeyPairs: pubkeysObj3:' + pubkeysObj3);
   var pubkeyArray = [];
   pubkeyArray = Object.keys(pubkeysObj3).map(function(_) { return pubkeysObj3[_].pubkey; })
   return pubkeyArray;  // ????
}

输出结果为:

before findKeyPair
inside findKeyPair pubkeysObj: { pubkey: 'n2eTmd37KTGhRZNJsf9tfVdCG1YejciETu' },{ pubkey: 'n2cBvz74bMGUf35gAdnSksbBnW1m4HfCmg' }

1 个答案:

答案 0 :(得分:1)

  

您是否愿意使用wait.for?

我使用" wait.for"重写了我的代码。现在我可以从数据库接收对象KeypairObj并将其传递给下一个函数makeKeyPairs。 在这个函数里面我可以打印我的数组(pubkeyArray)但是 我无法获得返回值(pubkeyArray2),并且函数findKeyPair的最后一行未被执行。

这是新代码:

var wait = require('wait.for');
var Keypair = require('./app/models/Keypair');

try {
   // launch a new fiber
   wait.launchFiber(findKeyPair, Keypair);
}
catch(err) {
   console.log('err' + err);
}

function findKeyPair(Keypair){
   var KeypairObj = wait.forMethod(Keypair,'find', {}, {pubkey: 1, _id: 0});
   console.log('1: ' + KeypairObj.toString());
   var pubkeyArray2 = wait.for(makeKeyPairs, KeypairObj);
   console.log('3: pubkeyArray2: ' + pubkeyArray2);  // not executed !!!
}

function makeKeyPairs(pubkeysObj3){
   pubkeyArray = Object.keys(pubkeysObj3).map(function(_) { return pubkeysObj3[_].pubkey; });
   console.log('2: pubkeyArray: ' + pubkeyArray);
}

和输出:

1: { pubkey: 'n2eTmd37KTGhRZNJsf9tfVdCG1YejciETu' },{ pubkey: 'n2cBvz74bMGUf35gAdnSksbBnW1m4HfCmg' }
2: pubkeyArray: n2eTmd37KTGhRZNJsf9tfVdCG1YejciETu,n2cBvz74bMGUf35gAdnSksbBnW1m4HfCmg