Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.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和promises在数组中顺序执行函数_Javascript_Promise - Fatal编程技术网

Javascript 使用reduce和promises在数组中顺序执行函数

Javascript 使用reduce和promises在数组中顺序执行函数,javascript,promise,Javascript,Promise,我有一系列函数 var functorray=[function1、function2、function3] 函数如下所示。都是一样的 var function2 = (value, callback) => { setTimeout(() => { value++; callback(null, value); }, 2000); } 我想使用reduce和promises顺序执行这些函数。但是下面的代码不起作用。我没办法控制住它

我有一系列函数

var functorray=[function1、function2、function3]

函数如下所示。都是一样的

var function2 = (value, callback) => {
    setTimeout(() => {
        value++;
        callback(null, value);
    }, 2000);
}
我想使用
reduce
promises
顺序执行这些函数。但是下面的代码不起作用。我没办法控制住它

var wrapper = (functionName, value) => {

    return new Promise((resolve, reject) => {
        functionName(value, (error, returnedValue) => {
            console.log(returnedValue);
            resolve(returnedValue);
        });
    });
}

var execute = function () {
    return functionArray.reduce((promise, currentFunction) => {
        return promise.then((value = 10) => {
            wrapper(currentFunction, value);
        });
    }, Promise.resolve());
};
当我调用
execute
时,值11会立即打印三次。我是不是遗漏了什么

实时片段:

var function1=(值,回调)=>{
设置超时(()=>{
值++;
回调(null,value);
}, 2000);
}
var function2=(值,回调)=>{
设置超时(()=>{
值++;
回调(null,value);
}, 2000);
}
变量函数3=(值,回调)=>{
设置超时(()=>{
值++;
回调(null,value);
}, 2000);
}
变量包装器=(函数名,值)=>{
返回新承诺((解决、拒绝)=>{
functionName(值,(错误,返回值)=>{
console.log(返回值);
解析(返回值);
});
});
}
var execute=函数(){
返回函数ray.reduce((承诺,当前函数)=>{
返回承诺。然后((值=10)=>{
包装器(currentFunction,value);
});
},Promise.resolve());
};
var functorray=[function1,function2,function3];
执行()问题就在这里(
***
):

您没有返回
包装器
生成的承诺,因此
然后
回调的结果是
未定义
,因此您调用它的承诺没有解析为新承诺。因此,
wrapper
一个接一个地被调用三次,两秒钟后,超时发生。这也解释了为什么三次得到11个:后续调用看不到前一次调用的结果(它们看到
未定义的
),因此每次
值的默认值为10

如果您退回承诺,则:

return functionArray.reduce((promise, currentFunction) => {
    return promise.then((value = 10) => {
        return wrapper(currentFunction, value);
// −−−−−^^^^^^
    });
}, Promise.resolve());
或:

…它按预期将它们展开,它们可以看到并使用上一次调用的返回值:

var function1=(值,回调)=>{
设置超时(()=>{
值++;
回调(null,value);
}, 2000);
}
var function2=(值,回调)=>{
设置超时(()=>{
值++;
回调(null,value);
}, 2000);
}
变量函数3=(值,回调)=>{
设置超时(()=>{
值++;
回调(null,value);
}, 2000);
}
变量包装器=(函数名,值)=>{
返回新承诺((解决、拒绝)=>{
functionName(值,(错误,返回值)=>{
console.log(返回值);
解析(返回值);
});
});
}
var execute=函数(){
返回函数ray.reduce((承诺,当前函数)=>{
返回承诺。然后((值=10)=>{
返回包装器(currentFunction,value);
});
},Promise.resolve());
};
var functorray=[function1,function2,function3];

执行()返回值不正确

参数始终为10

  return wrapper(currentFunction, value, timeout);
见:

也许这也能帮助你:

“我想使用reduce和promissions按顺序执行这些函数”为什么承诺,特别是当函数不提供承诺时?我不知道,只是想尝试一下,理论上,如果我写一个包装器,将回调转换为承诺,它应该可以正常工作?我用一个实时片段更新了你的问题,但它和你描述的不一样。它确实显示了11次,但不是立即显示;它等待2秒钟。这也是您看到的,还是代码片段不是您代码的准确反映?您必须一个接一个地调用该函数。似乎所有函数都是在2秒后调用的。是的,所有函数都是同时执行的。即使它不应该。
return functionArray.reduce((promise, currentFunction) => {
    return promise.then((value = 10) => wrapper(currentFunction, value));
//−−^^^^^^
}, Promise.resolve());
  return wrapper(currentFunction, value, timeout);