Return 2 个变量使用 bluebird promises

Return 2 variables using bluebird promises

我正在尝试使用 Node.js 的 Bluebird 库编写一个承诺函数。我想从我的函数中 return 2 个变量。 我希望第一个函数立即 return,第二个函数在 returning 之前完成自己的承诺链。

function mainfunction() {
    return callHelperfunction()
    .then(function (data) {
        //do something with data
        //send 200 Ok to user
    })
    .then(function (data2) {
        //wait for response from startthisfunction here
    })
    .catch(function (err) {
        //handle errors
    });
}

function callHelperfunction() {
    return anotherHelperFunction()
    .then(function (data) {
        return data;
        return startthisfunction(data)
        .then(function () {
            //do something more!
        })
    });
}

就像常规函数只有一个 return 值一样,同样的类比,promises 只能用一个值解析。

就像常规函数一样,您可以 return 来自承诺的复合值,如果您 return 一个数组,您也可以使用 .spread 轻松使用它:

Promise.resolve().then(function(el){
     return [Promise.resolve(1), Promise.delay(1000).return(2));
}).spread(function(val1, val2){
      // two values can be accessed here
      console.log(val1, val2); // 1, 2
});

唯一似乎错误的是 do something with data; send 200 Ok to user; 应该在 mainfunction() 中执行的期望,在 callHelperfunction() 中通过承诺链的一部分。

这可以通过多种方式克服。这是一对:

1.将 do something with data; send 200 Ok to user; 移动到 callHelperfunction()

function mainfunction() {
    return callHelperfunction())
    .catch(function (err) {
        //handle errors
    });
}

function callHelperfunction() {
    return anotherHelperFunction()
    .then(function (data1) {
        //do something with data
        //send 200 Ok to user
        return startthisfunction(data1)
        .then(function (data2) {
            //wait for response from startthisfunction here
            //do something more!
        });
    });
}

2。完全放弃 callHelperfunction() 并在 mainfunction()

中完成所有操作
function mainfunction() {
    return anotherHelperFunction()
    .then(function (data1) {
        //do something with data1
        //send 200 Ok to user
        return startthisfunction(data1);
    })
    .then(function (data2) {
        //wait for response from startthisfunction here
    })
    .catch(function (err) {
        //handle errors
    });
}