【问题标题】:.then is not a function / Promises.then 不是函数/承诺
【发布时间】:2018-09-13 03:39:37
【问题描述】:

出现错误。则不是函数。

当我调用一个得到一些东西的函数时:

Store.BackgroundFinalizer().then(function() {
  console.log('DO ALARM when Data is there');
  alarmNextEpisode();
});

功能:

static BackgroundFinalizer() {
  const items = Store.getStoredItems();
  items.forEach(function (item) { // 0.1
    if (new Date(item.episode) < new Date()) {
      let tvmaze = new Tvmaze();
      tvmaze.getData(item.name).then(data => {
        tvmaze.getEpisodeData(data.data.id).then(data => {
          let newdate = tvmaze.sortByNextEpisode(data);
          Store.removeStoreItem(item.name);
          Store.storeItem2(item.name, newdate);
        });
      });
    } else {}
  });
  return 'promise'
}

我需要返回一个承诺吗?即使功能本身不需要一个?怎么办?

【问题讨论】:

  • BackgroundFinalizer() 会返回一个字符串。你不能把它当作一个承诺......如果不是。
  • return 'promise' 不返回承诺,它返回一个字符串。那有什么用?如果你需要返回一个实际的 Promise,返回一个实际的 Promise,不要以为 JavaScript 能明白你在这里的意思。
  • 我应该回报什么承诺?我实际上不需要返回任何东西。
  • @Medy 你需要知道什么时候完成吗?
  • @KevinB 不,我只是为了运行 alarmNextEpisode(); getEpisodeData 完成后

标签: javascript promise


【解决方案1】:

使用前需要study promise

static BackgroundFinalizer() {
  return new Promise ( (resolve, reject) => {
    const items = Store.getStoredItems();
    items.forEach(function (item) { // 0.1

        if (new Date(item.episode) < new Date()) {

            let tvmaze = new Tvmaze();

             tvmaze.getData(item.name).then(data => {

                return tvmaze.getEpisodeData(data.data.id);

             }).then(data => {

                     let newdate = tvmaze.sortByNextEpisode(data);
                     Store.removeStoreItem(item.name);
                     Store.storeItem2(item.name, newdate);

             });

        } else {

        }


    });

    resolve('success');
  });
}

【讨论】:

  • @KevinB 他的代码有很多错误,我不想爆炸,所以他需要一个承诺,他会得到承诺。甚至没有注意到我写下了一个forEach。现在forEach 回调仍在运行,我会以任何方式解决它。
  • 感谢这项工作。 @Matthew Moore 解决方案没有。需要重新研究一下是的
【解决方案2】:

return 'promise' 正在返回字符串 promise,而不是 Promise。您需要为您的代码创建一个 Promise,更类似于我在下面所做的:

(注意,我只是把它扔进去了,没有完整的测试可用;代码中可能还有其他问题。但这应该让你更接近你的目标)

static BackgroundFinalizer() {
  return new Promise(function(resolve, reject) {
    const items = Store.getStoredItems();
    items.forEach(function(item) { // 0.1
      if (new Date(item.episode) < new Date()) {

        let tvmaze = new Tvmaze();

        tvmaze.getData(item.name).then(data => {

          tvmaze.getEpisodeData(data.data.id).then(data => {

            let newdate = tvmaze.sortByNextEpisode(data);
            Store.removeStoreItem(item.name);
            Store.storeItem2(item.name, newdate);

          });
        });
      } else {
	  };
    });
	
	resolve();
  });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 2016-12-06
    • 2019-07-09
    • 2016-06-27
    • 1970-01-01
    • 2021-10-17
    • 2016-01-21
    • 2021-05-01
    相关资源
    最近更新 更多