gpt4 book ai didi

javascript - 嵌套返回 promise 的函数数组

转载 作者:行者123 更新时间:2023-11-29 21:44:46 26 4
gpt4 key购买 nike

这里我有 4 个返回 promise 的函数。如果你运行 hello 并将每个传递给下一个 .then 你会得到一个长字符串。

var hello = function(str){
return Promise.resolve(str+ "hello")
}
var world = function(str){
return Promise.resolve(str+ "world")
}
var foo = function(str){
return Promise.resolve(str+ "foo")
}
var bar = function(str){
return Promise.resolve(str+ "bar")
}

// hello("alpha").then(world).then(foo).then(bar).then(console.log)
// => alphahelloworldfoobar

我希望能够将函数的平面数组传递给函数并返回一个将它们全部嵌套的函数。

var arr = wrapThen([
hello,
world,
foo,
bar
])

arr("alpha").then(console.log)

这可能吗? bluebird 提供这个吗?

这是我一起破解的:

function wrapThen(arr){
var headPromise = arr.shift()
return function(){
var args = _.values(arguments)
var init = headPromise(args)
var values = []
return Promise.each(arr, function(item){
init = init.then(item)
return init.then(function(value){
values.push(value)
return value
})
}).then(function(){
return _.last(values)
})
}
}

最佳答案

当然,使用 bluebird 和 reduce 这很容易,这基本上就是 reduce 所做的(聚合结果):

let result = Promise.reduce([hello, world, foo, bar], function(result, action){
return action(result);
}, "alpha");

在 ES2015 符号中,这变得更加简洁:

let {reduce} = Promise;
let result = reduce(arr, (result, action) => action(result), "alpha");

var hello = function(str){
return Promise.resolve(str+ "hello");
};
var world = function(str){
return Promise.resolve(str+ "world");
};
var foo = function(str){
return Promise.resolve(str+ "foo");
};
var bar = function(str){
return Promise.resolve(str+ "bar");
};


Promise.reduce([hello, world, foo, bar], function(result, action){
return action(result);
}, "alpha").then(function(endResult){
console.log(endResult);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.33/bluebird.min.js"></script>

关于javascript - 嵌套返回 promise 的函数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31624750/

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