使用bluebird promises返回2个变量

时间:2015-07-23 14:48:43

标签: javascript node.js promise bluebird

我正在尝试使用Bluebird库为nodejs编写一个promise函数。我想从我的函数中返回2个变量。 我希望第一个函数立即返回,第二个函数在返回之前完成自己的promise链。

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!
        })
    });
}

2 个答案:

答案 0 :(得分:5)

就像常规函数只有一个返回值一样,类似的promises只能解析一个值,因为它是相同的类比。

与常规函数一样,您可以从promise返回复合值,如果返回数组,也可以使用.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
});

答案 1 :(得分:1)

唯一看似错误的是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
    });
}