gpt4 book ai didi

javascript - Bluebird 的 promise 链数组

转载 作者:数据小太阳 更新时间:2023-10-29 05:57:34 26 4
gpt4 key购买 nike

我正在按照我的方式使用 promises,但我受困于我的用例。我有一组转换器函数(每个函数都是一个 promise 并修改一些 JSON 结构)。

让我展示一些代码。

假设这是我的 JSON 结构(数组)

var data = [{a: 1, b:2}, {a:3, b:4}]; 

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);
})
},
...
}

来自用户界面的用户指定他应该使用哪些转换器功能以及使用顺序。假设他选择了这样的正常顺序:

var userTransformList = ['transform1', 'transform2'];

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

我正在查看:Promise.all 但它似乎并不关心 promise 的顺序,最重要的是它需要将上一个结果传递给下一个 promise 。

最佳答案

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

  1. 创建一个要执行的函数数组。并确保它们都返回一个 Promise。

  2. 然后,您可以使用Promise.reduce通过在每次迭代中返回执行当前 promise 返回函数的结果,将初始值减少为转换后的最终值。

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

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

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

输出

[ { a: 1, b: 2, c: 3, d: 6 }, { a: 3, b: 4, c: 7, d: 14 } ]

关于javascript - Bluebird 的 promise 链数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30732880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com