40

我只用了几天的蓝鸟,但我想回顾一下我所有的旧代码和promisify它:)

我的问题是我仍然没有完全掌握then()命令的流程。

考虑这两个块:

一个

methodThatReturnsAPromise().then(task2).then(task3);

var promise = methodThatReturnsAPromise();
promise.then(task2)
promise.then(task3);
  1. 在场景 A 中task3会得到task2? 在 B 中他们都得到了第一个承诺的结果?

  2. 第二个与Promise.all从蓝鸟跑步有什么不同?

  3. Promise.all在使用方法时,这些 A/B/有何不同catch(我把它放在哪里)。

抱歉,这是一堆问题。

4

3 回答 3

48

欢迎来到美妙的承诺世界。

then在您的示例中如何工作

你的断言1是正确的。Promise.resolve我们可以使用一个值来模拟 Bluebird 中的 Promise 解析。

让我们展示一下:

让我们得到一个返回 Promise 的函数:

function foo(){
    return Promise.resolve("Value");    
}

foo().then(alert);

"Value"正如我们所见,这个简短的片段会发出警报。

现在,让我们再创建两个 Promise,每个 Promise 发出警报并返回不同的值。

function task2(e){
    alert("In two got " + e);
    return " Two ";
}
function task3(e){
    alert("In three got " + e);
    return " Three ";
}

因此,正如您在第一个代码中看到的那样,它确实会在一个链中解析,每个都具有前一部分的值。

在第二个示例中,task2 和 task3 都会得到相同的值,并且也会一起执行(即任务 3 不会等待任务 2)。你可以在这里看到。

承诺.all

Promise.all (或者只是从履行处理程序返回一个数组then然后使用.spread)用于等待多个结果全部完成。在您的示例中,您将单个结果挂钩到多个部分。

问题

你总是把 catch 放在你想捕获错误的地方。正如您通常在同步代码中所做的那样。只要记住总是抛出一个承诺或承诺的代码。

于 2014-01-23T02:43:57.300 回答
12

在场景A task3 会得到task2 的结果吗?在 B 中他们都得到了第一个承诺的结果?

是的。

第二个与从 bluebird 运行 Promise.all 有何不同?

您不会将(并行)任务 2 和 3 的结果提取到新的 Promise 中。

在使用 catch 方法时,这些 A/B/Promise.all 有何不同(我把它放在哪里)。

通常你会把它放在链的末端,除非你想捕获一个特定的错误。

promise.catch()
// handles rejections of this promise

promise.then(task2).catch()
// handles rejections from either promise or task2
// if promise is rejected, task2 will not be executed

Promise.all(promise.then(task2), promise.then(task3)).catch()
// handles rejections from any.
// if promise is rejected, neither task2 nor task3 will be executed
// if task2 or task3 throw, the error will immediately handled
// and the other task will not be affected (but its result is unavailable)
于 2014-01-23T02:44:37.327 回答
3

你没有得到一个简单的原则链接

在第一个可以写成

var promise   = methodThatReturnsAPromise(),
    promise1  = promise.then(task2);
promise1.then(task3);

在第二种情况下

var promise   = methodThatReturnsAPromise();
promise.then(task2)
promise.then(task3);

希望这可以解释两者的区别

于 2016-03-22T04:54:34.963 回答