可以等待,然后在一个实现混合使用吗?(Can await and then be mixed in

2019-09-27 12:57发布

我想知道,如果等待和。那么可以在同一个异步函数中使用? 这里是我的功能:

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);
    }
  }
});
},

然后,我调用另外一个,我的对象保存到索引资料与我已经从imgur API得到了链接这个功能。

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
  });

我为什么选择这种方式? 因为当我只用等待的关键字(不承诺构造函数),数据添加到数据库之前的承诺得到了解决; /什么不是我想要的东西(可能是我的地方犯了一个错误.. IDK)。

我的问题是,如果上面的代码是要做到这一点(它按预期工作)或者我应该重构它的正确方法是什么? 如果有,请告诉我怎么样。 这个问题是不是与特定问题相关的信息对我来说。 谢谢。

Answer 1:

是的,你可以使用混合awaitthen的语法-他们在承诺都工作-但你不应该在同一个函数这样做 。

但是,这不是在你的代码的主要问题。 问题是使用的Promise构造反模式在uploadImageToImgur功能。 不要使用async function S作为回调。 不要创建在承诺then没有回调return荷兰国际集团他们-的拒绝response.json()不是由您的代码捕获。

是的,你将需要Promise构造函数promisify读者,但仅此而已。 因素它自身的功能里面,这样你就不会导致自己陷入诱惑。 也就是说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 respnse = 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;
  }
},


文章来源: Can await and then be mixed in one implementation?