与蓝鸟的承诺链数组

sen*_*sor 5 javascript arrays promise bluebird es6-promise

我是一个承诺的工作方式,我坚持使用我的用例.我有一个变换器函数数组(每个函数都是一个promise并修改了一些JSON结构).

让我展示一些代码.

让我们说这是我的JSON结构(数组)

var data = [{a: 1, b:2}, {a:3, b:4}]; 
Run Code Online (Sandbox Code Playgroud)

transformFunction变换函数的定义是以某种方式修改数据.这两个函数增加cd属性上述JSON结构:

var transformFunctions = { // 

    transform1: function (data) {  // This function adds `c` property to each object from `a`
        return new Promise(function (resolve) {
             for (var i = 0; i < data.length; i++) {
                 data[i].c = data[i].a;
             }
             return resolve(data);
        })
    },

    transform2: function (data) {  // This function adds `d` property to each object from `c`
        return new Promise(function (resolve) {
             for (var i = 0; i < data.length; i++) {
                 data[i].d = data[i].c;
             }
             return resolve(data);
        })
    },
    ...
}
Run Code Online (Sandbox Code Playgroud)

来自UI用户指定他应该使用哪些变换器功能以及按什么顺序.让我们说他选择了这样的正常顺序:

var userTransformList = ['transform1', 'transform2'];
Run Code Online (Sandbox Code Playgroud)

transform1方法应该修改数据,结果应该传递给transform2方法.

我在看:Promise.all但它似乎并不关心承诺的顺序,最重要的是它需要将之前的结果传递给下一个承诺.

the*_*eye 5

注意:正如adeneo在评论中指出的那样,只有在处理异步代码时才使用promises.

  1. 创建要执行的函数数组.并确保他们都返回Promise.

  2. 然后,您可以Promise.reduce通过在每次迭代时返回执行当前承诺返回函数的结果来将初始值减少到已转换的最终值.

  3. 最后,您可以附加then处理程序以获取实际值和catch处理程序,以防万一Promise被拒绝.

假设我们有两个这样的变换函数.

注意:我再说一遍.你永远不应该将Promises与这些函数一起使用.只有当你正在处理的函数真的是异步的时候才应该使用promises.

// Just add a property called `c` to all the objects and return a Promise object
function transform1(data) {
    return Promise.resolve(data.map(function(currentObject) {
        currentObject.c = currentObject.a + currentObject.b;
        return currentObject;
    }));
}

// Just add a property called `d` to all the objects and return a Promise object
function transform2(data) {
    return Promise.resolve(data.map(function(currentObject) {
        currentObject.d = currentObject.a + currentObject.b + currentObject.c;
        return currentObject;
    }));
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样转换原始值

Promise.reduce([transform1, transform2], function (result, currentFunction) {
        return currentFunction(result);
    }, [{a: 1, b: 2}, {a: 3, b: 4}])      // Initial value
    .then(function (transformedData) {
        console.log(transformedData);
    })
    .catch(function (err) {
        console.error(err);
    });
Run Code Online (Sandbox Code Playgroud)

产量

[ { a: 1, b: 2, c: 3, d: 6 }, { a: 3, b: 4, c: 7, d: 14 } ]
Run Code Online (Sandbox Code Playgroud)