繁体   English   中英

异步/等待返回承诺<pending>

[英]Async/await return Promise<pending>

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

有一个搜索函数flickr.js,它在Flickr API中搜索查询,但是该函数返回Promise,但是我需要一个对象{query,images:[{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.');
  }
 };
});

您的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);

异步功能是ES7包装器的诺言。 这只是表达同一件事的一种方式。 为了从函数接收返回的值,由于它是异步的,因此需要等待它。 这可以通过使用也是异步的父函数来实现。 假设我有2个函数ab 它们都是异步的。

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

调用时, a将显示b的返回值。 当发生错误或函数返回时,promise分别为“ resolved”或“ rejected”。

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

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM