我在数组上映射,对于新对象的一个返回值,我需要进行异步调用.

var firebaseData = teachers.map(function(teacher) {
  return {
    name: teacher.title,
    description: teacher.body_html,
    image: urlToBase64(teacher.summary_html.match(/src="(.*?)"/)[1]),
    city: metafieldTeacherData[teacher.id].city,
    country: metafieldTeacherData[teacher.id].country,
    state: metafieldTeacherData[teacher.id].state,
    studioName: metafieldTeacherData[teacher.id].studioName,
    studioURL: metafieldTeacherData[teacher.id].studioURL
  }
});

该函数的实现类似于

function urlToBase64(url) {
  request.get(url, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      return "data:" + response.headers["content-type"] + ";base64," + new Buffer(body).toString('base64');
    }
  });
}

我不清楚最好的方法是什么...promise ?嵌套回调?使用ES6或ES7中的内容,然后使用Babel进行传输?

目前实现这一点的最佳方式是什么?

推荐答案

一种方法是Promise.all (ES6).

这个答案在Node 4.0+中适用.旧版本需要一个Promise polyfill或库.我还使用了ES6箭头功能,您可以将其替换为Node<;4.

这项技术用promise 手动包装request.get.你也可以使用像request-promise这样的图书馆.

function urlToBase64(url) {
  return new Promise((resolve, reject) => {
    request.get(url, function (error, response, body) {
      if (!error && response.statusCode == 200) {
        resolve("data:" + response.headers["content-type"] + ";base64," + new Buffer(body).toString('base64'));
      } else {
        reject(response);
      }
    });
  })
} 

// Map input data to an Array of Promises
let promises = input.map(element => {
  return urlToBase64(element.image)
    .then(base64 => {
      element.base64Data = base64;
      return element;
    })
});

// Wait for all Promises to complete
Promise.all(promises)
  .then(results => {
    // Handle results
  })
  .catch(e => {
    console.error(e);
  })

Node.js相关问答推荐

当建议在第二代上运行云功能时,现在是否有新的Firestore AdminClient可供使用?

无法从ejs Web应用程序中的正文中提取数据

已知NPM无法在node.js V12上运行的问题

如何在ejs模板中使用循环显示多个结果?

无法生成仅具有生产依赖项的 node 类型脚本项目

Puppeteer 的 BrowserFetcher 发生了什么?

如何在 require 方法中使用路径与node.js react ?

为什么我的 npm 脚本中的 glob 不起作用?

NPM 错误:修复upstream 依赖冲突安装 NPM 包(云功能)

MongoDB Atlas中的聚合触发器不起作用

带有事件网格的 Azure 函数在没有 ngrok 的情况下在本地运行

Discord.js V14 interaction.editReply 给出了一个无效的 webhook 令牌错误

AWS EC2 npm install 突然很慢

tsc:当我上传 React+next js 和 node 项目时,在 heroku 找不到

如何在 AWS 上的 Amazon Linux AMI 中自动启动 node.js 应用程序?

如何使用 Node.js 将 base64 编码图像(字符串)直接上传到 Google Cloud Storage 存储桶?

用一级 try ... catch 捕获 JavaScript Promise 中的错误

Heroku + Node:找不到模块错误

如何从 find 方法返回 Mongoose 结果?

在 Node.js 中获取终端的宽度