【问题标题】:Using Promise, getting error "Cannot read property 'then' of undefined"使用 Promise,出现错误“无法读取未定义的属性 'then'”
【发布时间】:2016-01-28 22:30:41
【问题描述】:

我正在使用 Promise 并关注 another example,但是当我运行脚本时出现错误 TypeError: Cannot read property 'then' of undefined。我的代码如下所示:

var completedLinks = ["http://www.example.com/1","http://www.example.com/2","http://www.example.com/3"]
function fetchSiteDetails(arr){
  arr.reduce(function(promise, email) {
    console.log(email)
  }, Promise.resolve());
}

fetchSiteDetails(completedLinks).then(function() {
    console.log('all done');
});

我猜fetchSiteDetails 对使用then 无效,但我不知道为什么?

【问题讨论】:

  • fetchSiteDetails 不返回承诺? :)
  • 除了在 r​​educe 中登录到控制台之外,您还在做什么?如果每个循环都是异步的,则需要多个 Promise
  • 首先需要使用 Promise 的异步任务在哪里?

标签: javascript promise


【解决方案1】:

您没有返回来自fetchSiteDetails 的承诺,也没有使用arr.reduce 产生值。试试这样的:

function log(message) {
  document.body.innerHTML += message + '<br />';
}

function fetchSiteDetails(arr) {
  return arr.reduce(function(promise, email) {
    log(email);
    return promise;
  }, Promise.resolve());
}

fetchSiteDetails([1, 2, 3]).then(function() {
  log('Done');
});

【讨论】:

  • @charlietfl then 将起作用,因为初始值是一个承诺,并且不会通过 reduce 以任何方式更改,这将返回一个承诺,但该函数仍然没有任何用处。
  • 如果我在里面添加一些东西,比如对cheerio的请求,它会等到完成该工作后再开始下一个链接吗?
  • @maudulus 否,因为您使用的是同步运行的.reduce。相反,您可能必须设置一系列承诺,这些承诺仅在所有其他承诺完成后才解决您返回的承诺。
【解决方案2】:

就像您想要Promise.all() 已经提供的相同行为。 试试这样的:

var completedLinks = ["http://www.example.com/1","http://www.example.com/2","http://www.example.com/3"]
function fetchSiteDetails(arr){
  return Promise.all(arr.map(function(email) {
    return Promise.resolve(); // do whatever here, but return a promise !
  }));
}

fetchSiteDetails(completedLinks).then(function() {
  console.log('all done');
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-26
    • 2018-01-15
    • 2018-06-02
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多