Bluebird Promise Warning: .then 只接受函数但被传递

Bluebird Promise Warning: .then only accepts functions but was passed

使用"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 在实际从 getPromise2 函数获取 Promise 对象时期望函数。然而,承诺被调用。 (有帮助的反对票)

我的困境是如何链接承诺,这样新的承诺将在then中被调用在第一个承诺执行后运行。

getPromise2() 调用立即创建承诺;然后忽略传递给 then 而不是回调。要实际链接它们,您需要使用

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

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

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

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