【问题标题】:Make multiple callbacks from node js asynchronous function从节点js异步函数进行多个回调
【发布时间】:2016-03-10 15:40:07
【问题描述】:

如何返回一个由异步函数多次调用的异步函数返回的数据对象。

我正在尝试这样实现:

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);
});

如何正确解决,我搜索了又搜索但找不到解决方案。

附言。我正在使用Figlet.js

【问题讨论】:

  • 澄清你想要什么:你不止一次地异步调用一些东西,并且想要将两个/所有响应都放入一个数组中,并且只在填充了两个/所有项目的数组中调用一次回调?
  • 是的,这正是我想要的
  • 试着研究一下 promises 和这个:stackoverflow.com/questions/10004112/… question.

标签: javascript node.js asynchronous


【解决方案1】:

我不知道你是否可以使用外部模块,但你可以使用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 参数作为带有参数errordata 的函数调用。 data 参数将作为数组项传递给tiptoe 流上的以下函数。

【讨论】:

  • 我无法实现它。我使用this
【解决方案2】:

我自己做的 :) 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]);
});

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2021-07-04
    • 2019-02-12
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2014-02-13
    • 1970-01-01
    相关资源
    最近更新 更多