【问题标题】:What's wrong with this async function?这个异步函数有什么问题?
【发布时间】:2017-08-24 10:21:48
【问题描述】:
async lsEntered(){
  if(this.service.wd == '')
    {
      await basic((this.service.wd));
    }
    else
    {
      await basic(('/'+this.service.wd));
    }

    this.files = await JSON.parse(localStorage.getItem('FILENAMES'));

    var filesList = document.getElementById(this.trackLine.toString());
    var li;
    for (var i = 0; i < this.files.length; i++) {
    li = document.createElement('li');
    li.appendChild(document.createTextNode(this.files[i].name));
    filesList.appendChild(li);
  }

  localStorage.clear();

}

我想等到 basic 完成并且 JSON.parse 完成后再显示 DOM 中的值。每次我都会得到上一个调用的值,这告诉我异步不起作用。公平地说,我没有大量的 TS 经验。

编辑:这是基本的,我希望不必处理它,因为它是一个 javascript 函数并且脆弱地集成到这个应用程序中。

var basic = function (path) {
    var ACCESS_TOKEN = '';
    var dbx = new Dropbox({ accessToken: ACCESS_TOKEN });
    dbx.filesListFolder({ path: path })
        .then(function (response) {
        localStorage.setItem('FILENAMES',JSON.stringify(response.entries));
        console.log(response);
    })
        .catch(function (error) {
        console.error(error);
    });
    return false;
}

【问题讨论】:

  • 可能basic有错误。
  • 你没有在basic返回一个承诺
  • 您可能希望使该访问令牌无效,现在每个人都可以在编辑历史记录中看到它
  • JSON.parse 不返回承诺,所以你应该省略 await 那里
  • 而不是将结果存储在本地存储中,您应该使用它来解决承诺。这将使basic 的使用更加灵活。

标签: javascript angular typescript async-await


【解决方案1】:
let myPromise = new Promise((resolve, reject) => {
  // Work you want to execute
  resolve("I am done");
});

myPromise.then((successMessage) => {
  // successMessage is whatever we passed in the resolve(...) function above.

  console.log("Yay! " + successMessage);
});

【讨论】:

  • 我在哪里以及如何使用 Promise?我是这个游戏的新手。
  • 很有帮助,但我认为我需要将代码分为三个部分。如何添加另一个 myPromise。然后当我尝试添加第三个时它会出现编译错误。
  • 尝试创建一个你使用promise.all()的promise数组。你会在这个链接中找到developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
【解决方案2】:

您只能await 承诺1 并且basic 没有返回承诺。你需要做的

return dbx.filesListfolder(...)...

还要考虑一下Bergi said in their comment


1:实际上,您可以await 任何值,但await 没有任何意义的东西不是承诺。通过basic返回承诺,lsEntered不会等待本地存储设置。

【讨论】:

  • 我是否需要在某处将 dbx.filesListFolder 的返回声明为承诺?
  • 我花了 3 个小时尝试处理打字,并决定改为这样做:(
猜你喜欢
  • 2017-11-16
  • 1970-01-01
  • 2021-01-15
  • 2012-04-05
  • 1970-01-01
  • 2017-03-26
  • 2014-06-29
  • 2011-02-13
  • 2011-04-24
相关资源
最近更新 更多