蓝鸟承诺警告:。然后只接受功能但已通过

时间:2016-09-19 14:48:54

标签: node.js promise bluebird

使用"bluebird": "^3.4.6"

var Promise = require('bluebird');

Promise.config({
    warnings: true,
    longStackTraces: true,
    cancellation: true,
    monitoring: true
});


function getPromise1(param1, param2) {
    return new Promise( (resolve, reject) => { 
        console.log(param1, param2); 
        resolve();
    } );
}

function getPromise2(param1, param2) {
    return new Promise( (resolve, reject) => { 
        console.log(param1, param2);
        resolve();
    } );
}


function mainFunc(param1, param2) {
    getPromise1(param1, param2)
        .then(getPromise2(param1, param2));
}

mainFunc("param1", "param2");

当我运行它时,我得到:

$ node index.js
param1 param2
param1 param2
(node:95984) Warning: .then() only accepts functions but was passed: [object Object]

如果没有警告,我如何修改这段代码来做同样的事情?这个警告是否相关,或者它只是开发人员的预测?

编辑:是的。我理解警告的文本​​,即.then在实际从Promise函数获取getPromise2对象时需要一个函数。然而,承诺被称为。 (有用的downvotes)

我的困境是如何链接承诺,以便在第一个承诺执行后在then函数中调用新Promise 。 / p>

2 个答案:

答案 0 :(得分:3)

getPromise2()电话会立即产生承诺;然后将其忽略传递给then而不是回调。要实际链接它们,您需要使用

function mainFunc(param1, param2) {
    return getPromise1(param1, param2).then(function(promise1result) {
        return getPromise2(param1, param2);
    });
}

答案 1 :(得分:2)

关键是你必须将一个函数传递给.then()。您正在立即执行您的函数并从该函数传递返回的结果(这是一个承诺)。因此,您可以像在Bergi的答案中创建自己的匿名包装函数,或者可以使用.bind(),如下所示:

function mainFunc(param1, param2) {
    return getPromise1(param1, param2).then(getPromise2.bind(null, param1, param2));
}

.bind()为您创建包装函数,并允许您在以后实际调用该函数时指定要预先渲染到参数列表的参数。