Проблема здесь (***
):
return functionArray.reduce((promise, currentFunction) => {
return promise.then((value = 10) => {
wrapper(currentFunction, value); // ***
});
}, Promise.resolve());
Вы не возвращаете обещание, которое wrapper
производит, поэтому результат обратного вызова then
undefined
, и поэтому обещание, на которое вы его призываете, не подчинено этому новому обещанию.Таким образом, wrapper
вызывается три раза один за другим, а через две секунды происходят тайм-ауты.Это также объясняет, почему вы получаете 11 три раза: последующие вызовы не видят результат предыдущего (они видят undefined
), поэтому вы получаете значение по умолчанию 10 для value
каждый раз.
Если вы возвращаете обещание, либо:
return functionArray.reduce((promise, currentFunction) => {
return promise.then((value = 10) => {
return wrapper(currentFunction, value);
});
}, Promise.resolve());
, либо:
return functionArray.reduce((promise, currentFunction) => {
return promise.then((value = 10) => wrapper(currentFunction, value));
}, Promise.resolve());
... оно распределяется в соответствии с ожиданиями, и они видят и используют возвращаемое значениепредыдущий звонок:
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();