然后在承诺中返回陈述

时间:2014-06-26 13:17:56

标签: javascript promise

我学习了Promises(来自this shim的vanilla es6 promises)我有两个函数,每个函数都返回一个新的Promise和一个名为magic()的第三个函数,它调用2函数并返回一个Promise。

示例代码:

var CreatorX = {
    "create": function() {
        var p = new Promise(function(resolve, reject) {
            window.setTimeout(function() {
                window.console.log("created");
                resolve(22);
            }, 100);
        });
        return p;
    }
};

var CreatorY = {
    "create": function(id) {
        window.console.log("id " + id);
        var p = new Promise(function(resolve, reject) {
            window.setTimeout(function() {
                resolve(2244);
            }, 5);
        });
        return p;
    }
};

这就是魔术:

function magic() {
       return CreatorX.create().then(function(d) {
            CreatorY.create(d); // shouldn't it be 'return CreatorY...'?
        });
}

var r = magic();
r.then(function() {
    console.log("Done");
}, function(err){console.error("oops")});

我的问题是,为什么这有效?我在魔术函数中的CreatorY.create(d)行没有返回语句,但似乎有效。 return应该在那里吗?这是巧合吗?

2 个答案:

答案 0 :(得分:2)

当您从Promise函数返回一些内容时,将使用您返回的值解析promise。承诺函数的返回值将传递给链式promise函数。

在您的情况下,您没有明确地返回任何内容。因此,JavaScript将解决undefined的承诺,并且

可以使用
function() {
    console.log("Done");
}

功能。但是你忽略了先前承诺的已解决价值。如果您确实想要使用它,请将功能更改为

function(result) {
    console.log(result);
}

现在您将能够看到实际解决的值。

答案 1 :(得分:1)

您的函数magic()会返回一个承诺,以便CreatorY.create(d)调用运行,但当您通过调用r.then(...

return CreatorX.create().then(...运行承诺时