如何将Promise.all与多个参数一起使用?

时间:2018-02-17 13:41:20

标签: javascript node.js promise

我刚开始使用Node.js.我有这个代码,我拿薪水和天数,然后计算你每天可以花费的平均金额,直到你获得下一个薪水(本月5日)。第一个承诺用于验证用户输入,第二个承诺实际上在第一个承诺完成后计算结果。下面的代码工作正常,但我想使用Promise.all来深入了解该主题。

var prompt = require('prompt');

prompt.start();

var promise1 = function(){
    return new Promise(function(resolve,reject){
        prompt.get(['salary','day'],function(err,result){
            var x = result.salary;
            var y = result.day;
            var z =  /^[0-9]*$/;

            if(x.match(z) && y.match(z))
            {
                resolve(result);
            }
            else{
                reject('invalid day or salary');
            }

        })
    })
}

var promise2 = function(x,y){
    //console.log('x is ' + x);
    return new Promise(function(resolve,reject){
        if(y>=1 && y<5){
            var z = x/(5-y);
            resolve(z);
        }
        else if(y<=30 && y>5){
            var z = x/(35-y);
            resolve(z);
        }
        else{
            reject('day not within range...');
        }
    })
}



promise1().then(function(resolve){
    return promise2(resolve.salary,resolve.day);

}).then(function(resolve){
    console.log(resolve);
}).catch(function(fromReject){
    console.log(fromReject);
})

1 个答案:

答案 0 :(得分:2)

Promise.all不是您希望作为参数传递给它的promise之间具有依赖关系时所需的函数。每当您需要一个承诺的承诺值来创建下一个承诺时,Promise.all不是一个选项。使用then执行此操作的方式是如何完成的(但不要调用结果resolve)。您也可以使用asyncawait来实现相同目标。

由于只有第一个承诺具有异步代码,所以第二个承诺根本没有必要存在。但如果您真的希望它成为承诺,那么请返回Promise.resolve,而不是new Promise