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的博客