Как изменить это обещание. Затем обещать. Все с асинхронным ожиданием? - PullRequest
1 голос
/ 25 октября 2019
const posts = [{
        title: 'Post One',
        body: 'This is Post 1'
    },
    {
        title: 'Post Two',
        body: 'This is Post 2'
    },
    {
        title: 'Post Three',
        body: 'This is Post 3'
    }
]

Я создаю массив сообщений здесь

function getPosts() {
    setTimeout(() => {
        let output = '';
        posts.forEach((post) => {
            output += `<li>${post.title}</li>`;
        });
        document.body.innerHTML = output;
    }, 1000);
}

Сначала я получаю сообщение с помощью get Post. Чтобы сделать это как запрос API, я делаю с setTimeoutFunction ();

function CreatePost(post) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            posts.push(post);
            const error = false;

            if (!error) {
                resolve();
            } else {
                reject('Error Something Went wrong')
            }
        }, 2000)
    })
}

Я создаю четвертый пост с CreatePost

function CreateAnotherPost(post) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            posts.push(post);
            const error = false;
            if (!error) {
                resolve(console.log(posts));
            } else {
                reject('something went wrong')
            }
        }, 5000);
    })
}

Здесь я создаю еще один пост с очень долгим временем ожидания

CreateAnotherPost({
    title: 'Post Five',
    body: 'This is post Five'
}).then(CreatePost({
    title: 'Post Four',
    body: 'This is post Four'
})).then(getPosts).catch(error => console.log(error));

Я могу заставить его работать плавно с цепочкой .then. Но я не знаю, как использовать обещание. Все

Ответы [ 3 ]

1 голос
/ 25 октября 2019

Вы используете Promise.all(), когда у вас есть более одного обещания, и вы хотите выполнять эти асинхронные операции параллельно. Чтобы использовать его, вы просто передаете Promise.all() массив обещаний:

Promise.all([
     CreatePost({title: 'Post Four', body: 'This is post Four'}), 
     CreateAnotherPost({title: 'Post Five', body: 'This is post Five'})
]).then(results => {
    console.log(results);
}).catch(err => {
    console.log(err);
});

Результаты затем предоставляются в массиве, который упорядочен в соответствии с массивом входных обещаний (результаты приходят из обещаний, которые разрешаются с помощьюзначение, которое вы не знаете по неизвестной причине - именно так вы должны сообщать результат асинхронности). Если какое-либо из обещаний будет отклонено, Promise.all() будет отклонено, и вы получите только причину отклонения, а не другие результаты.

1 голос
/ 25 октября 2019

Promise.all принимает, array обещаний и выполняет их по порядку, синхронно. Если одно первое обещание разрешает , то оно выполняет второе обещание. Если какое-либо обещание отклоняет , оно переходит в .catch блок Promise.all .

Если все обещания разрешается успешно, затем он переходит в .then блок Promise.all

Promise.all([
    this.CreateAnotherPost({title: 'Post Five',body: 'This is post Five'}),
    this.CreatePost({title: 'Post Four',body: 'This is post Four'})
   ])
   .then((res)=>{
       // todo after all promise resolves successfully
   })
   .catch((err)=>{
       // todo after if any of the promises resolves rejects
   })

Надеюсь, это поможет!

1 голос
/ 25 октября 2019

Promise.all принимает массив обещаний и ожидает разрешения всех обещаний в массиве и возвращает разрешенное поощрение. Если в каком-либо из обещаний в массиве возникает какая-либо ошибка, он достигает блока catch

Вы можете попробовать этот подход

Promise.all([CreateAnotherPost({
    title: 'Post Five',
    body: 'This is post Five'
  }),
  CreatePost({
    title: 'Post Four',
    body: 'This is post Four'
  })
]).then(getPosts).catch(error => console.log(error));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...