【问题标题】:NodeJS return async result from function [closed]NodeJS从函数返回异步结果[关闭]
【发布时间】:2016-03-11 05:10:52
【问题描述】:

我是nodejs的新手,遇到一个简单的问题,但是解决不了。

例如,我有这样的功能:

var func = function(){  
  setTimeout(function(){  
    return 5;  
  }, 1000);  
}; 

当我调用 func 时,我得到了“未定义”。我明白为什么,但我不明白如何更改我的函数以返回 5 而不是 undefined。
我可以使用回调参数重写 func,并从 setTimeout 调用回调,但我想从函数返回结果而不使用回调。
在 V8 中,我们有生成器和关键字“yield”,我认为它可能对我有帮助,所以任何人都可以解释它是如何工作的以及如何在这个例子中使用它。谢谢。

【问题讨论】:

  • 从异步回调中获取返回值的想法根本上是荒谬的。在 Node 中,您必须为软件设计中的几乎所有内容考虑异步。这就是为什么 Node API 都涉及回调的原因,你的也一样。
  • 好的,我理解你,看,我会尽力解释我的问题。我举了一个有问题的简单例子,但实际上问题是这样的:我有一个班级。它有一个异步执行某些操作的功能。我有这个类的一个实例数组,我想得到一个包含这些函数结果的数组。如果我这样写:array.map((e) => {e.func()}));比我得到填充“null”的数组,所以给我一段可以工作的代码。 Async.map 会这样做,但是怎么做呢?我听不懂
  • “所以给我一段可以工作的代码”...你真的只是这么说吗?
  • 使用 Promise 是解决问题的一种方法:stackoverflow.com/questions/14220321/… 寻找 Promise.all()
  • 如果您想阻止投票的浪潮,请从您之前的评论中获取您的问题的实际描述并将其编辑到您的问题中,以便我们知道这里要解决的真正问题是什么。这里最好的问题描述了他们的实际问题,而不是他们尝试解决的问题。并且,放弃对“给我代码”的苛刻态度。你只是在这里和普通人交谈。如果您体谅他人、很好地描述您的问题并寻求帮助而不是要求帮助,我们更有可能提供帮助。

标签: javascript node.js callback generator yield


【解决方案1】:

好的,这是我对您的问题陈述的理解(您应该首先将其放在您的问题中)。

您有一个对象的实例数组,该对象具有最终产生一些值的异步方法。而且,您想调用数组中的每个对象并生成它们的异步结果数组。

有几种方法可以解决这个问题。我先用 Promises 展示一个。

// your object
function MyObj() {
}

// with an async method that returns a promise
MyObj.prototype.doAsync = function() {
    return new Promise(function(resolve) {
        setTimeout(function() {
            // create some value to resolve with here 
            // I've just substituted a random value
            resolve(Math.floor(Math.random() * 1000));
        }, 50);
    });
}

// make an array of these objects like your problem statement described
var arr = [];
for (var i = 0; i < 20; i++) {
    arr[i] = new MyObj();
}  

// collect an array of promises by running all the async methods
var promises = [];
for (i = 0; i < arr.length; i++) {
   promises.push(arr[i].doAsync());
}

// wait for all the promises to be done
Promise.all(promises).then(function(results) {
    // array of async results here
    log(results);
});


function log(x) {
    var div = document.createElement("div");
    div.innerHTML = JSON.stringify(x);
    document.body.appendChild(div);
}

有关从异步函数返回数据的一般参考,请参阅How do I return the response from an asynchronous call?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2022-12-22
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2020-03-15
    相关资源
    最近更新 更多