Javascript 可以等待,然后在一个实现中混合使用吗?
我想知道wait和.then是否可以在同一个异步函数中使用? 以下是我的功能:Javascript 可以等待,然后在一个实现中混合使用吗?,javascript,asynchronous,promise,async-await,Javascript,Asynchronous,Promise,Async Await,我想知道wait和.then是否可以在同一个异步函数中使用? 以下是我的功能: uploadImageToImgur: async function (file) { return new Promise(function(resolve, reject) { const url = 'https://api.imgur.com/3/image', reader = new FileReader(); if (file) { reader.readAsDataURL(fi
uploadImageToImgur: async function (file) {
return new Promise(function(resolve, reject) {
const url = 'https://api.imgur.com/3/image',
reader = new FileReader();
if (file) {
reader.readAsDataURL(file);
}
reader.onloadend = async function () {
let { result } = reader;
try {
const request = await fetch(url, {
method: 'POST',
headers: {
"Authorization": 'my auth',
},
body: result.replace(/^data:image\/(png|jpg|jpeg|gif);base64,/, "")
})
.then((response) => {
response.json()
.then(data => {
resolve(data.data.link)
})
});
} catch (e) {
reject(e);
}
}
});
},
然后我在另一个函数中调用这个函数,在这个函数中,我使用从imgurapi获得的链接将对象保存到indexedDb
this.uploadImageToImgur(image)
.then((image) => {
let db = this.dbOpen.result,
tx = db.transaction('EventsStore', 'readwrite'),
store = tx.objectStore('EventsStore');
event = store.put({ title, location, description, summary, date, time, image });
//rest of the code
});
我为什么选择这种方法?因为当我只使用wait关键字(没有promise构造函数)时,数据是在promise解析之前添加到数据库中的;/什么不是我想要的(可能我在某处犯了一个错误..idk)
我的问题是,上面的代码是否是实现这一点的正确方法(它按预期工作),或者我应该重构它吗?如果是,请告诉我怎么做。这个问题对我来说信息量很大,与具体问题无关。
谢谢。是的,您可以使用mix
wait
和then
语法-它们都适用于承诺-但是
但这不是代码中的主要问题。问题是在uploadImageToImgur
函数中使用了。不要将async函数
s用作回调。不要在然后
回调中创建承诺而不返回
它们-拒绝响应.json()
不会被代码捕获
是的,您需要向读者提供Promise
构造函数,但仅此而已。在它自身的功能中考虑它,这样你就不会让自己陷入诱惑。执行人内部的if(file)
条件导致您的承诺在某些情况下永远无法解决
清理:
function readDataUrl(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = function() {
resolve(this.result);
};
reader.onerror = reader.onabort = reject; // don't forget this!
reader.readAsDataURL(file);
});
}
uploadImageToImgur: async function(file) {
const url = 'https://api.imgur.com/3/image',
if (file) {
const result = await readDataUrl(file);
const response = await fetch(url, {
method: 'POST',
headers: {
"Authorization": 'my auth',
},
body: result.replace(/^data:image\/(png|jpg|jpeg|gif);base64,/, "")
});
const data = await response.json();
return data.data.link;
}
}
您忘了标记语言。将
拒绝
保留为默认实现是否符合惯例?@Slaiyer我不知道“惯例”,但如果可能(并且有用),我建议避免在不必要的额外函数中包装解析
和拒绝
。在本例中,我希望调用onerror
回调,并将错误作为参数,因此对我来说是有意义的。如果您想使用自定义错误/消息进行拒绝,当然,可以使用拒绝该错误/消息的函数。