Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';在处理递归时,有承诺的reduce模式的替代方案是什么?_Javascript_Promise_Es6 Promise - Fatal编程技术网

Javascript 什么';在处理递归时,有承诺的reduce模式的替代方案是什么?

Javascript 什么';在处理递归时,有承诺的reduce模式的替代方案是什么?,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,注意:我不能使用async 我喜欢在需要运行数组并在其成员上执行相同的函数并返回承诺的情况下使用reduce模式,如下所示: 函数get_count(){ 返回新承诺(功能(解决、拒绝){ 决心(3); }); } 函数递归执行(数据){ 返回新承诺(功能(解决、拒绝){ 解析(数据); }); } 函数reduce\u promise\u pattern(){ const get_batch_run_count=get_count(); const batch\u process=get\u

注意:我不能使用
async

我喜欢在需要运行数组并在其成员上执行相同的函数并返回承诺的情况下使用
reduce
模式,如下所示:

函数get_count(){ 返回新承诺(功能(解决、拒绝){ 决心(3); }); } 函数递归执行(数据){ 返回新承诺(功能(解决、拒绝){ 解析(数据); }); } 函数reduce\u promise\u pattern(){ const get_batch_run_count=get_count(); const batch\u process=get\u batch\u run\u count。然后((count\u value)=>{ const run_count=新数组(count_值)。填充('batch'); 函数递归函数(数据){ log('Running batch!'); 递归返回执行(数据)。然后(()=>{ 返回数据; }); } 返回运行计数。减少((以前的承诺)=>{ 返回以前的承诺。然后((以前的响应)=>{ 测试数据={ “测试”:1 }; 返回递归函数(测试数据); }) },Promise.resolve()) }); 返回批处理;
}您已经达到了承诺链的极限,尽管它们可以工作,但它们不可读。这就是为什么引入了
async
/
await
来准确处理这些用例的原因,使用它们,您可以停止各种(嵌套)循环,而不必维护每个循环的承诺:

 async function reducePromisePattern() {
   for(let i = await getCount(); i >= 0; i--) {
     await recursiveFunction({'test': 1 });
   }
 }
如果您不能使用/transfile
async
,您仍然可以编写一些小助手来为您执行循环,例如:

 function loopAsync(times, fn) {
   function task() {
    times--;
    if(times <= 0) return;
    return fn().then(task);
   }

   return Promise.resolve().then(task);
 }

 function reducePromisePattern() {
   return getCount().then(function(count) {
      return asyncLoop(count, function() {
         return recursiveFunction({ test: 1 });
      });
   });
 }   
函数loopAsync(次,fn){
功能任务(){
时代--;

if(times这里有两个选项,彼此之间没有嵌套函数。第一个简单地使用for循环,而第二个函数使用递归解决方案。两个解决方案的最后一个参数都是可选的,仅当您希望将返回数据从一次运行传递到下一次运行时才应使用(类似于
reduce

const sleep=()=>新承诺(resolve=>setTimeout(resolve,Math.random()*1500+500));
//解决方案#1-用于循环
函数times1(n,回调,初始化){
var promise=promise.resolve(init);
对于(;n>0;--n){
promise=promise.then(val=>callback(val));
}
回报承诺;
}
//示例用法
时间1(3,n=>{
console.log(“解决方案#1-”,n);
返回sleep(),然后(()=>n+1);
}, 0);
//解#2-递归
函数times2(n,回调,初始化){
var promise=promise.resolve(init);
if(n次2(n-1,回调,回调(val)));
}
//示例用法
时间2(3,n=>{
console.log(“解决方案#2-”,n);
返回sleep(),然后(()=>n+1);

},0);
我无法使用
async
,不幸的是,根据我的经验,polyfills非常不可靠。对不起,如果我知道这可能是一个答案,我会在帖子中添加它(我现在会).Babel在这方面做得很好,从来没有任何问题。请让我参考上述软件包,如果它通过我的测试,我将尝试使用
wait
重新编写部分系统。我根本不懂JS,所以,请原谅我使用了错误的术语。这个场景对我来说并不完全清楚。你知道吗你从承诺数组或正常值数组开始?使用
reduce
的目的是什么?你想等到所有承诺都得到解决吗?因为在这种情况下,你也可以使用。几乎所有的迭代方法都可以实现对每个元素执行相同的函数,而不仅仅是
reduce
ach
map
也可以,但选择取决于您实际想要实现的目标。为了进一步阐述上述内容,我想代码段中缺少一个明确的示例。尽管您的代码段工作正常,但它并没有阐明您想要实现的目标。您可以添加这样的示例吗?例如。“我从第三方库返回了一系列承诺。如果承诺得到解决,我想为每个元素执行一个特定的函数。”@3limin4t0r忘记这个例子中“为什么”的细节。我的问题的理由是“这是对的吗?”?“。如果你真的看一下代码库,我不需要构建一个数组,数组中填充了N个大小相同的单词,N是我需要迭代运行的次数。所以我想知道是否有一种模式/解决方案可以让它看起来更好。