【问题标题】:Async/await return Promise<pending>异步/等待返回 Promise<pending>
【发布时间】:2018-09-30 11:42:46
【问题描述】:

首先我很抱歉提出关于 async/await 的问题,因为我知道有很多答案,但是在阅读了很多答案之后,我还没有找到一个可行的解决方案。

有一个搜索函数 flickr.js 可以在 Flickr API 中搜索查询,但该函数返回 Promise,但我需要一个对象 {查询,图像:[{photo1}, {photo2}, {photo3}]}

flickr.js 函数

window.MODULES.Flickr = async query => {
const opts = {
api_key: 'API_KEY'
};
const photos = await window.fetch(
`https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=${
  opts.api_key
}&text=${query}&format=json&nojsoncallback=1
`
);
const data = await photos.json();
const pictures = data.photos.photo;
const images = [];

pictures.forEach(picture => {
return images.push({
  id: picture.id,
  url: `https://farm${picture.farm}.staticflickr.com/${picture.server}/${
    picture.id
  }_${picture.secret}_s.jpg`,
  title: picture.title
});
});

return {
  query,
  images
 };
};

它是从

ImageFinder.js

function() {
let ImageFinder = (window.CLASSES.ImageFinder = function() {});

 ImageFinder.prototype.search = (query, moduleId) => {
  switch (moduleId) {
   case 'static':
     return window.MODULES.Static(query);
   case 'flickr':
     return window.MODULES.Flickr(query); // Need to return object { query, images : [{photo1}, {photo2}, {photo3}] }

   default:
    throw Error('Search module not found.');
  }
 };
});

【问题讨论】:

  • await window.MODULES.Flickr(query)
  • @str - 这将要求代码位于 async 函数内

标签: javascript


【解决方案1】:

您的window.MODULES.Flickr(query); 返回一个承诺,而处理该承诺{ query, images } 的结果的唯一方法是解决该承诺。没有其他方法可以解决这个问题。

因此,如果您想在ImageFinder.prototype.search 中使用promise 结果,则可以将其标记为async 并在搜索函数中使用await window.MODULES.Flickr(query); 来解析该值。

此外,所有使用 ImageFinder.prototype.search 的函数也必须首先解决承诺,例如使用awaitthen()

var obj = await imageFinder.search(query, moduleId);

【讨论】:

    【解决方案2】:

    异步函数是 ES7 对 promise 的封装。它只是表达同一事物的一种方式。为了从函数接收返回值,需要等待,因为它是异步的。这将通过使用也是异步的父函数来实现。所以假设我有 2 个函数,ab。它们都是异步的。

    async function a () {
        console.log(await b() );
    }
    

    当被调用时,a 会打印出b 的返回值。当发生错误或函数返回时,promise 分别被“resolved”或“rejected”。

    promise 会像常规函数一样返回其值,不同之处在于,为了捕获此结果,需要等待它,或者使用特定的 promise 函数,例如 thencatch

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2019-02-06
      • 2019-08-02
      • 2018-11-17
      • 2020-03-04
      • 2021-03-17
      • 2019-12-08
      • 2020-07-09
      • 2017-10-16
      • 1970-01-01
      相关资源
      最近更新 更多