在For循环中使用Bluebird Promise来构建和返回一个对象数组

时间:2017-07-28 05:49:58

标签: javascript promise bluebird zapier-cli

我正在尝试使用Bluebird Promises构建并返回一个Object。 Promise是一个HTTP请求,它获取要添加到Object的其他数据。

我创建了一个在for循环中执行请求的函数(我也使用了一个执行某些中间件的框架 - 这就是<div style="display: flex; justify-content: center;"> <a href="#" class="btn btn-outline-primary btn-lg">Button</a> </div>的内容)

z.

在以下代码中调用此函数:

const getWebAppCustomFieldDetails  = (z, url) => {
    const responsePromise = z.request({
        url:url,
        headers:{
          'content-type': 'application/json'
        }
     });
    return responsePromise
     .then(response =>{
      return JSON.parse(response.content);
     });
};

我无法弄清楚如何从嵌套的Promise中返回值

1 个答案:

答案 0 :(得分:0)

您可以使用Promise.reduce将您在for循环中创建的承诺列表缩减为单个承诺:

...
    .then(response => {
        const customFieldCount = response.fields.length;
        var customFieldAppend = '';

        // Promice.reduce will return the accumulator "totalFields"
        return Promise.reduce(response.fields, (totalFields, field) => {
            getWebAppCustomFieldDetails(z, field.links[0].uri) // Using the "field" variable provided by the reducer function
                            .then(response => {
                                customFieldAppend = {
                                    'key': response.name,
                                    'required': response.required,
                                    'type': response.type.toLowerCase()
                                };
                                // Add the data to the accumulator "totalFields"
                                totalFields.push(customFieldAppend);
                            });
        }, []); // The third argument is the initial value of the accummulator. In your example it is a an array, so the initial value is an empty array.
    });
...

Promise.reduce接受输入三个参数:循环参数列表(response.fields),reducer函数和累加器的初始值。累加器(我称之为totalFields)是reducer函数的第一个参数,它是用于在单个值中减少列表中的值的变量。在你的情况下,累加器是一个数组(你的例子中使用的fields数组)所以它的初始值是一个空数组。

reduce函数中,您可以访问列表的单个元素(第二个参数),您可以调用异步操作并在每一步填充累加器广告。 Promise.reduce函数将返回包含在promise中的累加器。因此,您的函数可以直接返回Promise.reduce的返回承诺。