2016-03-09 104 views
-1

如何從異步函數中返回由多次調用異步函數返回的數據對象。從節點js進行多個回調異步功能

我想實現這樣的:

var figlet = require('figlet'); 

function art(dataToArt, callback) 
{ 

var arry[]; 

    figlet(dataToArt, function(err, data) { 
     if (err) { 
      console.log('Something went wrong...'); 
      console.dir(err); 
      return callback(''); 
     } 
    arry[0] = data; 
     callback(arry); 
    }); 


figlet(dataToArt, function(err, data) { 
     if (err) { 
      console.log('Something went wrong...'); 
      console.dir(err); 
      return callback(''); 
     } 
    arry[1] = data; 
     callback(arry); 
    }); 

} 


art('Hello World', function (data){ 
    console.log(data); 
}); 

我怎麼做是正確的,我找啊找,但無法找到一個解決方案。

Ps。我正在使用Figlet.js

+1

爲了澄清你想要什麼:你叫什麼異步不止一次,並希望得到兩/全部回覆到一個數組,只有一次調用回調這兩個/所有項目的數組填充? –

+0

是的,這就是我想要的 –

+0

嘗試查看承諾和這個:http://stackoverflow.com/questions/10004112/how-can-i-wait-for-set-of-asynchronous-callback-functions問題。 – PNS

回答

0

做到了我自己:) Thanks to mostafa-samir's post

var figlet = require('figlet'); 

function WaterfallOver(list, iterator, callback) { 

    var nextItemIndex = 1; 
    function report() { 
     nextItemIndex++; 
     if(nextItemIndex === list.length) 
      callback(); 
     else 
      iterator([list[0],list[nextItemIndex]], report); 
    } 
    iterator([list[0],list[1]], report); 
} 

var FinalResult = []; 

WaterfallOver(["hello","Standard","Ghost"], function(path, report) { 
    figlet.text(path[0], { font: path[1] }, function(err, data) { 
     if (err) { 
      FinalResult.push("Font name error try help"); 
      report(); 
      return; 
     } 
     data = '<pre>.\n' + data + '</pre>'; 
     FinalResult.push(data); 
     report(); 
    }); 
}, function() { 
    console.log(FinalResult[0]); 
    console.log(FinalResult[1]); 
}); 
0

我不知道你是否可以使用外部模塊,但可以使用tiptoe

安裝它使用npm install tiptoe如同任何普通的模塊,它基本上是這樣的:

var tiptoe = require('tiptoe') 

function someAsyncFunction(obj, callback) { 
    // something something 
    callback(null, processedData); 
} 

tiptoe(
    function() { 
    var self = this; 
    var arr = ['there', 'are', 'some', 'items', 'here']; 
    arr.forEach(function(item) { 
     someAsyncFunction(item, self.parallel()); 
    }); 
    }, 
    function() { 
    var data = Array.prototype.slice.call(arguments); 
    doSomethingWithData(data, this); 
    }, 
    function(err) { 
    if (err) throw (err); 
    console.log('all done.'); 
    } 
); 

someAsyncFunction()是你要調用做一些事情異步函數調用callback參數與參數error功能和data。參數data將作爲數組項傳遞給tiptoe流程中的以下函數。

+0

我無法實現它..我使用[this](http://mostafa-samir.github.io/async-iterative-patterns-pt1/) –