Q承诺.“何时”和“然后”之间的差异

Q promise. Difference between .when and .then

本文关键字:之间 承诺 何时 然后      更新时间:2023-09-26

我认为这段代码可以工作:

var promise = function(val) {
    var _val = val;
    return setTimeout(function(_val) {
        var newVal = val / 10;
        return {
            newVal : newVal,
            message : 'it just to be a ' + val
        };
    }, 3000);
};
Q.when(promise(400)).then(function(obj) {
    return console.log('jaaaaj !', obj);
}, function() {
    return console.log('no yet...');
});

JSFiddle

我的想法是:当setTimeout在四秒钟后完成它的工作时,Q库将在第一次回调中捕获return,并显示具有两个属性的对象:newVal : 4message : 'it just to be a ' + 400。相反,我在成功回调中有一个奇怪的1数字作为obj。。。

BTW Q库中的.when.then有什么区别?

.when()将一个或多个promise作为参数。您正在向它传递一个计时器句柄,因此它将立即执行.then()处理程序。

.when()没有辨别你传递给它的东西何时完成的神奇能力。你必须通过一个或多个承诺,它会监控这些承诺何时得到解决。

此外,不能从setTimeout()返回任何内容,但如果在setTimeout()中解析了promise,则可以将数据传递给.resolve()方法。

你可以这样做:

var promise = function(val) {
    var defer = Q.defer();
    setTimeout(function() {
        var newVal = val / 10;
        defer.resolve({
            newVal : newVal,
            message : 'it just to be a ' + val
        });
    }, 3000);
    // return the promise
    return defer.promise;
};
Q.when(promise(400)).then(function(obj) {
    return console.log('jaaaaj !', obj);
}, function() {
    return console.log('rejected...');
});

但是,当你只有一个承诺时,你甚至不需要Q.when()。你可以这样做:

promise(400).then(function(obj) {
    return console.log('jaaaaj !', obj);
}, function() {
    return console.log('rejected...');
});