2015-10-26 99 views
1

我正在使用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?它提供了一個很好的光纖包裝器,可以讓你從異步調用中返回數據。 –

回答

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

更新:我發現問題:函數makeKeyPairs不會在回調中返回值,所以不需要wait.for。正確的行是 'var pubkeyArray2 = Object.keys(KeypairObj).map(function(_){return KeypairObj [_]。pubkey;});' – jfjobidon