在我要求之前如何不执行承诺

Los*_*lds 1 node.js es6-promise

我以为我已经把这一切都想到了Promise,但这个实际上让我起床了.在使用带有两个参数的执行程序创建一个新的Promise时,为什么这个方法在我接受then()或catch()之前运行

运行节点6.2.2.

import assert = require('assert');

describe("When working with promises", () => {
    let ar = [1, 2, 3, 4, 5, 6];

    beforeEach(() => {

    })

    it("should be perfectly fine but isn't when mapping to promises", (done) => {
        ar.map(num => {
            return new Promise((resolve, reject) => {
                done(new Error('Why on earth is ' + num + ' called'));
            })
        })

        done();
    })

    it("should be perfectly fine when mapping to methods", (done) => {

        ar.map(num => {
            return (resolve, reject) => {
                done(new Error(num + ' is not called ever'));
            }
        })

        done();
    })
});
Run Code Online (Sandbox Code Playgroud)

第一次测试失败,第二次测试成功.

Thi*_*ilo 6

如果查看Promise文档,您会发现给构造函数的函数是立即运行的.它应该揭开序幕,异步计算和安装两个回调有(这样resolvereject刚才不被调用,但每当计算完成或失败).

Promise函数不是异步计算,它只是将计算和你需要的两个回调包装在一起组成一个漂亮的包(并在完成此设置后立即返回).

您的第二个示例为每个数字创建一个匿名函数,但不会调用它们中的任何一个.

为什么这个方法在我接受then()或catch()之前运行

Promise并不关心您是否安装任何处理程序/链.无论是否有人在观看,计算都将开始(或不开始).