Связать несколько операторов prom.all ()

Я новичок в 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]

Что мне не хватает?

Ваша функция c ничего не возвращает

Patrick Evans 05.09.2018 06:19

@PatrickEvans Что ты имеешь в виду? Разве это не обещание?

user554481 05.09.2018 06:20

Привет, пользователь. Хорошо заданный вопрос - просто обратите внимание, что вы можете встроить javascript / html / css прямо в свой вопрос, что значительно упрощает ответ!

dwjohnston 05.09.2018 06:21

он возвращает что-то в обратном вызове, но это не возвращает в родительской функции c

Patrick Evans 05.09.2018 06:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
4
1 012
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Функция c в настоящий момент ничего не возвращает, в результате получается undefined. Вместо этого return вызывает Promise.all и после разрешения Promise.all возвращает y[0] + y[1] в .then, чтобы потребитель cd) имел доступ к разрешенному значению.

Также избегайте явный антипаттерн конструкции обещания - если у вас уже есть 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 ]

Другие вопросы по теме