如何使用npm同步node.js中的变量返回回调

问题描述:

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

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' } 
+0

你是开放使用wait.for?它提供了一个很好的光纤包装器,可以让你从异步调用中返回数据。 –

你是开放使用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 
+0

更新:我发现问题:函数makeKeyPairs不会在回调中返回值,所以不需要wait.for。正确的行是 'var pubkeyArray2 = Object.keys(KeypairObj).map(function(_){return KeypairObj [_]。pubkey;});' – jfjobidon