在Q承诺中,为什么立即被召唤?

时间:2015-03-17 11:47:45

标签: javascript promise q

拥有此代码

var Q = require('q');

var first = Q.fcall(function() {
    console.log('This will be output before actual resolution?');
    return "This is the result.";
});

setTimeout(function() {
    console.log('Gonna resolve.');
    first.then(function(r) {
        console.log(r);
    });
}, 3000);

为什么结果是

This will be output before actual resolution?
Gonna resolve.
This is the result.

而不是

Gonna resolve.
This will be output before actual resolution?
This is the result.

如何在调用then之后调用函数?

1 个答案:

答案 0 :(得分:3)

你误解了(典型的Javascript)承诺如何运作。在你打电话给.then之前,他们不会等待。他们完成工作,完成后,他们调用传递给.then的任何函数。

所以对于你的问题“我怎么才能在调用之后才调用函数?”,你不能,至少不是你想要的方式。这不是承诺的工作方式。

但你当然可以这样做:

var Q = require('q');

var getFirst = function () {
    return Q.fcall(function() {
        console.log('This will be output before actual resolution?');
        return "This is the result.";
    });
};

setTimeout(function() {
    console.log('Gonna resolve.');
    getFirst().then(function(r) {
        console.log(r);
    });
}, 3000);