如何从Node中的回调循环异步函数返回

时间:2017-05-10 16:48:21

标签: javascript node.js asynchronous

我正在尝试编写一个函数:

  1. 采用一系列网址
  2. 并行获取URL中的文件(顺序无关)
  3. 处理每个文件
  4. 返回包含已处理文件的对象
  5. 此外,我不需要#2或#3中的错误以任何方式影响我的应用程序中的其余执行 - 即使所有请求或处理都失败,应用程序仍可继续。

    我知道如何在循环中触发所有请求,然后在获得所有数据后,使用this insertCollection pattern.

    触发回调以处理文件

    然而,这并不高效,因为在尝试处理之前我不需要等待所有文件下载 - 我希望在每次下载完成时处理它们。

    到目前为止,我有这段代码:

    const request = require('request');
    
    const urlArray = [urlA, urlB, urlC];
    const results = {};
    
    let count = 0;
    let processedResult;  
    
    const makeRequests = function (urls, callback) {
        for (let url of urls) {
          request(url, function(error, response, body) {
            if (error) {
              callback(error);
              return;
            }
            processedResult = callback(null, body)
            if (processedResult) {
              console.log(processedResult); // prints correctly!
              return processedResult;
            }
          })
        }
    };
    
    const processResult = function(error, file) {
        if (error) {
          console.log(error);
          results.errors.push(error);
        }
    
        const processedFile = file + `<!-- Hello, Dolly! ${count}-->`;
        results.processedFiles.push(processedFile);
    
        if (++count === urlArray.length) {
          return results;
        }
      };
    
    const finalResult = makeRequests(urlArray, processResult);
    console.log(finalResult); // undefined;
    

    在最后一次调用processResult时,我设法发送了一个回复,而makeRequests抓住了它,但在此之后我没有在“finalResult”中“统治”。

    我的问题是:

    1. 为什么这不起作用?我可以打印一个结构良好的processedResultmakeRequests的最后一次迭代中,但不知怎的,我无法返回 它回到来电者(finalResult
    2. 如何解决这个问题,理想情况是“手工”,没有承诺或者 图书馆的帮助,比如async?

1 个答案:

答案 0 :(得分:-1)

makeRequests函数将undefined返回到finalResult,因为这是一个同步函数。什么都没有阻止代码执行,所以它到达函数的末尾,因为没有定义的return语句,它返回undefined为默认值。