1

Рассмотрим этот кусок кода:JS Promises - способ сделать это обещание более эффективным?

WordPress.getMediaById(res.data.featured_media) 
.then(function (res) { 
    post.featuredMedia = res.data.source_url; 

    WordPress.getUserById(post.authorId) 
    .then(function (res) { 
     post.authorName = res.data.name; 

     $scope.post = { 
     title: post.title, 
     introAsHtml: post.introAsHtml, 
     authorName: post.authorName, 
     contentAsHtml: post.contentAsHtml, 
     featured_media: post.featuredMedia 
     }; 
    }); 
}); 

Есть ли способ, чтобы сделать его более эффективным с точки зрения вложенности? В будущем я захочу добавить в него еще много обещаемых функций, и я не уверен, что это правильный путь, иначе как он действительно отличается от обратных вызовов ...

С уважением.

+0

Вы всегда должны 'return' вещи из ваших функций - особенно, когда они асинхронно – Bergi

+0

Вы используете Q или угловые обещания? – Bergi

+0

@ Берги Эй, обещания. –

ответ

4

Если запрос второго асинхронной не не зависит от результата первого звонка я определенно не собирал обещаний.

С помощью углового-х $q, вы можете так это:

$q.all([ 
    WordPress.getMediaById(mediaId), 
    WordPress.getUserById(userId)]) 
.then(response => { 
    post.featuredMedia = response[0].data.source_url; 
    post.authorName = response[1].data.name; 
    $scope.post = { 
    title: post.title, 
    introAsHtml: post.introAsHtml, 
    authorName: post.authorName, 
    contentAsHtml: post.contentAsHtml, 
    featured_media: post.featuredMedia 
    }; 
}); 
+0

OP отметил свой вопрос Q, поэтому вам не следует использовать '$ q'. – Bergi

+0

@ Берги, вы правы. но он помечен угловым на первом месте и, следовательно, поскольку он/она явно не упоминал только с использованием Q, он по-прежнему является действительным ответом. Не говоря уже о том, что Q имеет эквивалентное решение. – webduvet

+0

Я фактически использую угловые $ q. Спасибо @webduvet. Я также добавил угловой и ионный, поэтому я подумал, что это очевидно. –

4

Вы можете уменьшить вложенность так:

WordPress.getMediaById(res.data.featured_media) 
.then(function (res) { 
    //res.data is media 
    post.featuredMedia = res.data.source_url; 

    return WordPress.getUserById(post.authorId); 
}).then(function (res) { 
    //res.data is user 
    post.authorName = res.data.name; 

    $scope.post = { 
    title: post.title, 
    introAsHtml: post.introAsHtml, 
    authorName: post.authorName, 
    contentAsHtml: post.contentAsHtml, 
    featured_media: post.featuredMedia 
    }; 
}); 

Для получения дополнительной информации и четкое разъяснение обещаний, прочитать this блог Нолан Lawson

+0

Ваша ссылка не работает. – Bergi

+0

Итак, если я верну выполнение выполнения другой функции, которая возвращает обещание, я могу сразу связать их с «.then»? Правильно ли я понял? –

+0

@ Ариэль: Вы можете сократить это до «Если я верну обещание от« then' callback, ... », но в целом [да] (http://stackoverflow.com/a/22562045/1048572) – Bergi

Смежные вопросы