JS承诺 – 使这个承诺嵌套更有效的方法?

考虑这段代码:

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 }; }); }); 

有什么办法可以使它在嵌套方面更有效率? 在将来,我会想添加更多的承诺function,我不知道是否是正确的方式,否则,它是如何真正不同于callback…

问候。

除非第二个asynchronous请求不依赖于第一个调用的结果,否则我绝对不会嵌套这个promise。

借助于$q的angular度,你可以这样做:

 $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 }; }); 

你可以像这样减less嵌套:

 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 }; }); 

有关承诺的更多信息和明确的解释,请阅读Nolan Lawson的博客