【问题标题】:Return promise value [duplicate]返回承诺值[重复]
【发布时间】:2015-02-13 16:29:52
【问题描述】:

我是 Promise's 的新手,我正在努力寻找价值。

这是我想要做的事情的一个想法:

API = {
  get: function() {
    return new Promise(function(res) {
      setTimeout(function() {
        res('foo')
      }, 1000)
    })
  }
}

var foo = API.get()

console.log(foo)

var foo = API.get() 保持原样很重要。

知道在这里做什么吗?

【问题讨论】:

  • 什么都没有。你想要的是不可能的。我建议阅读 html5rocks.com/en/tutorials/es6/promises 以了解 Promise 的工作原理。
  • 这个问题似乎离题了,因为它是关于对异步性的根本误解。

标签: javascript promise


【解决方案1】:

Promise 仍然是异步的。您仍然无法在同步代码中检查它们的值。

你需要:

API.get().then(function(result) {
    // Resolved value from the Promise object returned by API.get()
    console.log(result);
});

API.get() 返回一个promise 对象,然后您对该对象调用.then() 方法。

另一种更详细的方式是:

var fooPromise = API.get();
fooPromise.then(function(result) { 
    console.log(result); 
});

【讨论】:

  • 你得到 +1 是因为我之前不知道我可以在答案中使用粗体:O
  • @BenjaminGruenbaum:使用<pre>,您甚至可以在代码中拥有链接 :-)
【解决方案2】:

承诺是关于未来发生的事情;除非您拥有一台时间机器,否则您现在无法检查它们的最终值。

我不建议你这样做,而只是为了教学目的,如果你真的希望你的代码能像你看起来的那样运行,你可以重新定义 console.log 使其具有承诺意识:

console.log = function() {
    var old_console_dot_log = console.log.bind(console);
    return function(maybe_promise) {
        Promise.resolve(maybe_promise).then(old_console_dot_log);
    };
}();

(此版本仅处理一个参数;处理更多参数留作练习。)

现在当你说console.log(foo) 时,它会记录foo 的解析值,但只有当它准备好时,一秒钟后。

【讨论】:

  • 我不明白为什么这被否决了。虽然我认为这个答案可以改进(在语气和内容上),但我在这里看不到任何值得反对的东西,而且日志技巧很聪明,因为它甚至保留了顺序 - 反对者 - 愿意解释原因吗?跨度>
  • 因为我认为代码 sn-p 中的 console.log 只是为了记录变量 foo 的值是常识,所以我不想覆盖 @987654327 @你们是真的吗。
  • @darylm。这是一个“你想要的东西是不可能的”(这是)+“跳出框框思考”。你首先得到了冷酷的事实,我不明白你为什么投反对票。
  • @daryl 你想要什么是不可能的。您的程序无法预见未来。
猜你喜欢
  • 2014-05-21
  • 2020-08-26
  • 2015-11-04
  • 2016-10-20
  • 2018-06-03
  • 2019-04-21
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多