【问题标题】:Warning: a promise was created in a handler at but was not returned from it [bluebird]警告:在处理程序中创建了一个承诺,但没有从它返回 [bluebird]
【发布时间】:2017-08-19 15:34:37
【问题描述】:

所以我从 GitHub 克隆了这个项目并运行了“npm install”,它以一些警告但没有错误结束,然后我运行了“npm run dev”,这 4 个命令的执行没有任何问题,但是,我得到了服务器启动后出现此错误。我有点卡在这一点上,非常感谢一些帮助。

这是我得到的错误:

promise.js

function Promise(executor) {
    if (executor !== INTERNAL) {
        check(this, executor);
}
    this._bitField = 0;
    this._fulfillmentHandler0 = undefined;
    this._rejectionHandler0 = undefined;
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._resolveFromExecutor(executor);
    this._promiseCreated();
    this._fireEvent("promiseCreated", this);
}

setup-classeur.js

function refresh (cb) {
    Tutorials.list().then(list => {
        CACHE.List = JSON.parse(list).map(file =>
            Object.assign({
                ref: urlify(file.name)
            }, file));

        Promise.all(CACHE.List
            .filter(shouldLoadFile)
            .map(file =>
                Tutorials.get(file.id).then(content => {
                    CACHE.Files[file.ref] = JSON.parse(content);
                }).catch(console.error))
        ).then(cb);
    }).catch(console.error);
}  

【问题讨论】:

标签: javascript node.js bluebird


【解决方案1】:

你在这里创建了一个承诺:

Promise.all(CACHE.List
    .filter(shouldLoadFile)
    .map(file =>
        Tutorials.get(file.id).then(content => {
            CACHE.Files[file.ref] = JSON.parse(content);
        }).catch(console.error))
).then(cb);

它没有被退回。这意味着,例如,如果它被拒绝,您的 .catch(console.error) 将不适用。您可以先返回它:

function refresh (cb) {
    Tutorials.list().then(list => {
        CACHE.List = JSON.parse(list).map(file =>
            Object.assign({
                ref: urlify(file.name)
            }, file));

        return Promise.all(CACHE.List
            .filter(shouldLoadFile)
            .map(file =>
                Tutorials.get(file.id).then(content => {
                    CACHE.Files[file.ref] = JSON.parse(content);
                }).catch(console.error))
        ).then(cb);
    }).catch(console.error);
}

不过,这仍然不是最优的,因为涉及到回调。理想情况下,您只需从 refresh 返回一个承诺,并将错误处理留给调用者,在那里它可能会做一些比记录错误更有用的事情。这也减少了重复代码。

function refresh () {
    return Tutorials.list().then(list => {
        CACHE.List = JSON.parse(list).map(file =>
            Object.assign({
                ref: urlify(file.name)
            }, file));

        return Promise.all(CACHE.List
            .filter(shouldLoadFile)
            .map(file =>
                Tutorials.get(file.id).then(content => {
                    CACHE.Files[file.ref] = JSON.parse(content);
                }))
        );
    });
}

然后您可以使用 Bluebird 的实用程序重新安排一下:

function refresh () {
    return Tutorials.list()
        .then(JSON.parse)
        .map(file =>
            Object.assign({
                ref: urlify(file.name)
            }, file))
        .tap(list => {
            CACHE.List = list;
        })
        .filter(shouldLoadFile)
        .map(file =>
            Tutorials.get(file.id).then(content => {
                CACHE.Files[file.ref] = JSON.parse(content);
            }));
}

并重构 Tutorials.list()Tutorials.get() 解析它们自己的 JSON:

function refresh () {
    return Tutorials.list()
        .map(file =>
            Object.assign({
                ref: urlify(file.name)
            }, file))
        .tap(list => {
            CACHE.List = list;
        })
        .filter(shouldLoadFile)
        .map(file =>
            Tutorials.get(file.id).then(content => {
                CACHE.Files[file.ref] = content;
            }));
}

如果您使用 Node 8.3.0 或更高版本:

function refresh () {
    return Tutorials.list()
        .map(file =>
            ({ ref: urlify(file.name), ...file }))
        .tap(list => {
            CACHE.List = list;
        })
        .filter(shouldLoadFile)
        .map(file =>
            Tutorials.get(file.id).then(content => {
                CACHE.Files[file.ref] = content;
            }));
}

【讨论】:

    猜你喜欢
    • 2017-11-02
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    相关资源
    最近更新 更多