Javascript 可以等待,然后在一个实现中混合使用吗?

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

我想知道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(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
回调,并将错误作为参数,因此对我来说是有意义的。如果您想使用自定义错误/消息进行拒绝,当然,可以使用拒绝该错误/消息的函数。