javascript - 为什么没有执行带有 'if' 的 Promise 之后的 block?

标签 javascript node.js asynchronous promise

我对异步编程相当陌生,并且试图理解为什么执行永远不会进入包含“if”的 promise 之后链接的“then” block 。有人可以帮忙吗?

var uploadResourceToView = function (edit) {
    var promises = [];

    for (var i = 0; i < inputConfig.length; i++) {
        promises.push(new Promise(function (resolve, reject) {
            var name = 'hey';

            new Promise(function (resolve) {
                if (i == 0) {
                    return new pTree().renamePage('Home', name);
                } else {
                    return edit.addPage(name, '3D')
                }
            })
            // subsequent then()s are never executed 
            .then(function () {
                console.log('why am I not been executed ? ');
                return edit.addObject(object)
            })
            .then(function () {
                return edit.addResource('test resource', true);
            })
            .then(resolve, reject);
        });
    }

    return Promise.all(promises);
}

最佳答案

因为你永远不会为你内心的 promise 调用resolvereject。您传递给 Promise 构造函数的执行函数的返回值将被完全忽略。要解决 promise ,请调用 new Promise 传递给执行程序的 resolvereject 回调。


就实际使整个功能正常工作而言,我猜测 renamePageaddPage 会返回 promise 。如果是这样,直接使用它们,不需要在该函数的任何地方使用 new Promise:

var uploadResourceToView = function (edit) {
    var promises = [];

    for (var i = 0; i < inputConfig.length; i++) {
        var name = 'hey';
        var inner = i == 0 ? new pTree().renamePage('Home', name) : edit.addPage(name, '3D');
        promises.push(inner
            .then(function () {
                console.log('why am I not been executed ? ');
                return edit.addObject(object)
            })
            .then(function () {
                return edit.addResource('test resource', true);
            })
        });
    }

    return Promise.all(promises);
}

更多:What is the explicit promise construction antipattern and how do I avoid it?

关于javascript - 为什么没有执行带有 'if' 的 Promise 之后的 block?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48239090/

相关文章:

javascript - 将双周期替换为单周期,如果 4 个或更多替换为三个

javascript - 使用 JavaScript 从对象中删除空数组

javascript - 使用 Vue CLI 在 Node js 上进行 Express session

asynchronous - 将数据对象与 Polymer 元素中的属性绑定(bind)

java - 维护线程安全,同时防止可能发生同步回调的死锁

javascript - 使用不带 ng-repeat 的 Angular Material md-select

javascript - jQuery.parseJSON() 不在 Windows 服务器上解码有效的 Json 字符串

node.js - 从 NPM 缓存中清除 *just one* 包

node.js - 无法提供具有快速路由且没有斜杠的静态文件

javascript - 带有反向 waitsFor 的简单 Jasmine 异步测试