Я новичок в javascript, и мне трудно связать несколько операторов обещания. Ниже представлена сильно упрощенная версия моего кода.
function a(x) {
return new Promise(function(resolve) {
setTimeout(resolve(x*2), 500)
});
}
function b(x) {
return new Promise(function(resolve) {
setTimeout(resolve(x*3), 400)
});
}
function c(x) {
const promises = [a(x),b(x)];
Promise.all(promises).then(function(y){
z = y[0] + y[1]
return new Promise(function(resolve, reject){
resolve(z);
});
});
}
function d(x) {
const promises = [];
for (let input of x){
promises.push(c(input))
}
Promise.all(promises).then(function(z){
console.info(z);
});
}
const data = [1,2,3,4,5];
d(data);Я бы хотел увидеть это напечатанным:
[5, 10, 15, 20, 25]
Но вместо этого я вижу это:
[undefined, undefined, undefined, undefined, undefined]
Что мне не хватает?
@PatrickEvans Что ты имеешь в виду? Разве это не обещание?
Привет, пользователь. Хорошо заданный вопрос - просто обратите внимание, что вы можете встроить javascript / html / css прямо в свой вопрос, что значительно упрощает ответ!
он возвращает что-то в обратном вызове, но это не возвращает в родительской функции c



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Функция c в настоящий момент ничего не возвращает, в результате получается undefined. Вместо этого return вызывает Promise.all и после разрешения Promise.all возвращает y[0] + y[1] в .then, чтобы потребитель c (в d) имел доступ к разрешенному значению.
Также избегайте явный антипаттерн конструкции обещания - если у вас уже есть Promise для работы, нет необходимости вызывать new Promise для создания отдельного. Вместо этого просто позвоните .then на существующий Promise.
function c(x) {
const promises = [a(x),b(x)];
return Promise.all(promises).then(function(y){
return y[0] + y[1]
});
}
function a(x) {
return new Promise(function(resolve) {
setTimeout(resolve(x*2), 500)
});
}
function b(x) {
return new Promise(function(resolve) {
setTimeout(resolve(x*3), 400)
});
}
function c(x) {
const promises = [a(x),b(x)];
return Promise.all(promises).then(function(y){
return y[0] + y[1]
});
}
function d(x) {
const promises = [];
for (let input of x){
promises.push(c(input))
}
Promise.all(promises).then(function(z){
console.info(z);
});
}
const data = [1,2,3,4,5];
d(data);Проблема с вашим кодом заключалась в том, что вы не возвращали обещания своих функций c(x) и d(x).
function a(x) {
return new Promise(function(resolve) {
setTimeout(resolve(x * 2), 500)
})
}
function b(x) {
return new Promise(function(resolve) {
setTimeout(resolve(x * 3), 400)
})
}
function c(x) {
const promises = [a(x), b(x)]
return Promise.all(promises).then(function(y) {
z = y[0] + y[1]
return new Promise(function(resolve, reject) {
resolve(z)
})
})
}
function d(x) {
const promises = []
for (let input of x) {
promises.push(c(input))
}
return Promise.all(promises)
}
const data = [1, 2, 3, 4, 5]
d(data) // then [ 5, 10, 15, 20, 25 ]
Ваша функция c ничего не возвращает