当前位置: 首页 > 面试题库 >

在地图中调用异步函数的最佳方法?

赵英范
2023-03-14
问题内容

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

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

我不清楚做到这一点的最佳方法是什么…承诺?嵌套的回调?在ES6或ES7中使用某些东西,然后与Babel进行转换?

目前实现此目的的最佳方法是什么?

谢谢!


问题答案:

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

该答案将在Node 4.0+中起作用。较旧的版本将需要Promise polyfill或库。我还使用了ES6箭头功能,function对于Node <4
,可以将其替换为常规s。

该技术request.get用Promise 手动包装。您还可以使用诸如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);
  })


 类似资料:
  • 问题内容: 我正在寻找从Java程序中执行Haskell函数的有效方法。我已经考虑过使用exec()与GHC进行交互,但是似乎应该有一个更好的方法。 问题答案: 我通常避免使用JNI类型的方法来跨运行时/语言进行链接。他们只是有太多的陷阱而没有什么好处。我发现跨流程边界工作更容易。尽管我从未在Haskell和Java上尝试过,但它们都具有支持XML RPC的库,听起来很自然地适合您的工作。因此:将

  • 问题内容: 我偶然发现了一段不是100%安全的Ajax代码,因为它混合了异步/同步类型的代码…所以基本上在下面的代码中我有一个jQuery.each,其中每个元素都获取有关元素的信息并启动Ajax收到每个请求: 因此,显然,“保存后要执行的代码…”通常在所有请求完成之前执行。在理想情况下,我想让服务器端代码一次处理所有这些代码,并保存成功回调后将//代码移到要执行的代码中,但是假设这不可能,我将代

  • 问题内容: 我如何访问传递给fs.lstat函数的变量? 问题答案: 这是使用而不是for循环迭代值的完美理由。 另外,您可以使用@Aadit建议的闭包:

  • 问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调

  • 问题内容: 现在,我有几次遇到使用Firebase的同步和异步功能的问题。我的问题通常是我需要在我编写的函数中进行异步Firebase调用。作为一个简单的示例,假设我需要计算并显示对象的速度,而我的Firebase存储距离和时间: 当然,上述代码将无法使用,因为它是异步调用,因此在到达时尚未设置。如果我们将内部放置在回调函数中,则什么也不会返回。 一种解决方案是使我的函数也异步。 另一种解决方案是

  • 问题内容: 我有以下代码: 是与Memcached数据库的连接。可以想象,回调函数是异步的,因此可以在for循环已结束时执行。同样,以这种方式调用时,它始终使用for循环的最后一个值。 我用这种方式尝试关闭 但是显然,这再次使用了for循环索引的最后一个值。 我也尝试在for循环之前声明一个函数,如下所示: 然后打电话 但同样没有成功,返回值始终是for循环的最后一个值。 谁能告诉我关闭有错吗?我