【问题标题】:The implementation for `promise` in JavaScript [duplicate]JavaScript中`promise`的实现[重复]
【发布时间】:2015-03-03 13:57:16
【问题描述】:

我读过这篇文章:

Callbacks are imperative, promises are functional: Node’s biggest missed opportunity

有一个代码:

var p1 = new Promise();
p1.then(console.log);
p1.resolve(42);

var p2 = new Promise();
p2.resolve(2013);
p2.then(console.log);

// prints:
// 42
// 2013

这对我来说很有意义。非常声明性的代码。

但是,一旦我在 node.js 中真正使用了promise 在做

npm bluebird

这里是实际工作的代码:

var Promise = require('bluebird');

var r1;
var p1 = new Promise(function(resolve){
  r1 = resolve;
});

p1.then(console.log);
r1(42);

var r2;
var p2 = new Promise(function(resolve){
  r2 = resolve;
});

r2(2013);
p2.then(console.log);

对我来说,以前的代码看起来更合理。 怎么回事?

有什么想法吗?谢谢。

【问题讨论】:

  • 不知道你在问什么。

标签: javascript node.js promise


【解决方案1】:

实际上,创建待处理的承诺或延迟是没有意义的.. 只需使用Promise.resolve

var p1 = Promise.resolve(42);
p1.then(console.log);

var p2 = Promise.resolve(2013);
p2.then(console.log);

【讨论】:

  • 我真的想在任何时候resolve,即使在then被调用之后。不过谢谢。
  • @KenOKABE 哦,在这种情况下,您只想链接已经返回的承诺。如果某事没有返回一个承诺,你可以承诺它,自己去解决问题会导致非常丑陋的代码
【解决方案2】:

这只是令人困惑的实现故障。

var Promise = require("bluebird");

def = Promise.defer()
// {promise: <Promise>, resolve: <Function>, reject: <Function>}

def.promise.then(console.log)

def.resolve(123) // 『123』

有效。

【讨论】:

  • 公平地说 - console.log 作为免费功能在浏览器中不起作用,Promise.defer() 已被弃用,自 Bluebird 2.0 起不再支持。
  • 你能告诉我替代方案吗?
  • Promise.resolve(123).then(console.log) - 正如副本所说。
  • 好的,所以我的不行。谢谢
猜你喜欢
  • 2021-11-05
  • 2019-04-18
  • 2018-03-16
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多