[英]Async/await return Promise<pending>
首先,我很抱歉提出有关异步/等待的问题,因为我知道有很多答案,但是在阅读了很多答案之后,我还没有找到可行的解决方案。
有一个搜索函数flickr.js,它在Flickr API中搜索查询,但是该函数返回Promise,但是我需要一个对象{query,images:[{photo1},{photo2},{photo3}]}}
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
};
};
它被称为
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
所有功能也必须首先解决承诺,例如使用await
或then()
var obj = await imageFinder.search(query, moduleId);
异步功能是ES7包装器的诺言。 这只是表达同一件事的一种方式。 为了从函数接收返回的值,由于它是异步的,因此需要等待它。 这可以通过使用也是异步的父函数来实现。 假设我有2个函数a
和b
。 它们都是异步的。
async function a () {
console.log(await b() );
}
调用时, a
将显示b
的返回值。 当发生错误或函数返回时,promise分别为“ resolved”或“ rejected”。
一个promise像常规函数一样返回其值,不同之处在于,为了捕获此结果,需要等待它,或者使用特定的promise函数(例如then
或catch
。
希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.