简体   繁体   English

使用reduce和promise顺序执行数组中的函数

[英]Sequentially executing functions in an array with reduce and promises

I have an array of functions我有一个函数数组

var functionArray = [function1, function2, function3];

The functions looks like this.功能看起来像这样。 All are identical都是一样的

var function2 = (value, callback) => {
    setTimeout(() => {
        value++;
        callback(null, value);
    }, 2000);
}

I want to execute these functions sequentially using reduce and promises .我想使用reducepromises依次执行这些函数。 But the below code is not working.但是下面的代码不起作用。 I am not able to get my head around it.我无法理解它。

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

When I invoke execute the value 11 gets printed three times immediately.当我调用execute ,值 11 会立即打印三遍。 Am I missing something here?我在这里错过了什么吗?

Live Snippet:实时片段:

 var function1 = (value, callback) => { setTimeout(() => { value++; callback(null, value); }, 2000); } var function2 = (value, callback) => { setTimeout(() => { value++; callback(null, value); }, 2000); } var function3 = (value, callback) => { setTimeout(() => { value++; callback(null, value); }, 2000); } 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()); }; var functionArray = [function1, function2, function3]; execute();

The problem is here ( *** ):问题在这里( *** ):

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

You're not returning the promise that wrapper produces, so the result of the then callback is undefined , and so the promise you're calling it on isn't resolved to that new promise.您没有返回wrapper生成的承诺,因此then回调的结果是undefined ,因此您调用它的承诺不会解析为该新承诺。 So wrapper is called three times one right after another, and two seconds later, the timeouts occur.所以wrapper被一次又一次地调用三遍,两秒钟后,超时发生。 It also accounts for why you get 11 three times: Subsequent calls don't see the result of the previous one (they see undefined ), so you're getting the default of 10 for value each time.这也解释了为什么你会得到 11 三次:后续调用看不到前一个调用的结果(他们看到undefined ),所以你每次都会得到默认value 10 。

If you return the promise, either:如果您返回承诺,则:

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

or:或者:

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

...it spreads them out as expected, and they see and use the return value of the previous call: ...它按预期将它们展开,然后它们会看到并使用上一次调用的返回值:

 var function1 = (value, callback) => { setTimeout(() => { value++; callback(null, value); }, 2000); } var function2 = (value, callback) => { setTimeout(() => { value++; callback(null, value); }, 2000); } var function3 = (value, callback) => { setTimeout(() => { value++; callback(null, value); }, 2000); } 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) => { return wrapper(currentFunction, value); }); }, Promise.resolve()); }; var functionArray = [function1, function2, function3]; execute();

the return values are not correct.返回值不正确。

Parameter is always 10.参数始终为 10。

  return wrapper(currentFunction, value, timeout);

See:看:

https://jsfiddle.net/js1n6xL3/3/ https://jsfiddle.net/js1n6xL3/3/

Maybe this can help you too: https://gist.github.com/anvk/5602ec398e4fdc521e2bf9940fd90f84也许这也可以帮助你: https : //gist.github.com/anvk/5602ec398e4fdc521e2bf9940fd90f84

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM