Javascript 将承诺分配给变量并在链中返回与仅返回承诺调用不同吗?

Javascript 将承诺分配给变量并在链中返回与仅返回承诺调用不同吗?,javascript,promise,Javascript,Promise,这两条链条的处理方式有什么不同吗?还是以相同的方式处理?使用一个比另一个有什么好处吗 我试过两个电话,它们都返回相同的结果32-我的假设是,它们以相同的方式处理,但我有一个朋友告诉我,它们的工作方式不同 const getNewDataPromise = num => new Promise( (resolve, reject) => { typeof num === 'number' ? resolve(num * 2) : reject(`${num}

这两条链条的处理方式有什么不同吗?还是以相同的方式处理?使用一个比另一个有什么好处吗

我试过两个电话,它们都返回相同的结果32-我的假设是,它们以相同的方式处理,但我有一个朋友告诉我,它们的工作方式不同

const getNewDataPromise = num => new Promise( (resolve, reject) => {
    typeof num === 'number' ? resolve(num * 2) : 
        reject(`${num} is not a number -- input must be a numeric value.`);
});

getNewDataPromise(2).then( data => {
    const nowEight = getNewDataPromise(data);
    return nowEight;
}).then( data => {
    const nowSixteen = getNewDataPromise(data);
    return nowSixteen;
}).then( data => {
    const nowThirtyTwo = getNewDataPromise(data);
    return nowThirtyTwo
}).then( data => {
    console.log(data);
}).catch( err => {
    console.log(err);
});

getNewDataPromise(2).then( data => {
    return getNewDataPromise(data);
}).then( data => {
    return getNewDataPromise(data);
}).then( data => {
    return getNewDataPromise(data);
}).then( data => {
    console.log(data);
}).catch( err => {
    console.log(err);
});

就结果而言,你的两个版本之间没有任何区别。第一个只是创建一个中间局部变量,它不会影响结果或并行性,或者像您的朋友所断言的那样

你的第二个更简洁,同样清晰,这将是我对你们两个的偏好

另一种选择是使用async/await,这对于异步操作序列特别有用:

async function run() {
    try {
        let data = await getNewDataPromise(2);
        data = await getNewDataPromise(data);
        data = await getNewDataPromise(data);
        data = await getNewDataPromise(data);
        console.log(data);
    } catch(e) {
        console.log(e);
    }
}
或者,如果你真的只是一遍又一遍地调用同一个函数,你也可以使用一个循环,这样重复性会少一点,也会更枯燥:

async function run() {
    try {
        let data = 2;
        for (let i = 0; i < 4; i++) {
            data = await getNewDataPromise(data);
        }
        console.log(data);
    } catch(e) {
        console.log(e);
    }
}

如果在它们被归还之前你什么都没做,那也没什么区别。作用域中的额外变量名本身没有任何作用,两者之间没有区别。同样的原因,收益率2和var x=2之间没有区别;返回x;。没有区别。当然这是主观的,但我认为一个好处是可读性。使其更具可读性的一种方法是:.thengetNewDataPromise.thengetNewDataPromise等等。还请记住,箭头函数正在返回,因此第二个块看起来仍然太冗长:.thendata=>getNewDataPromisedata使代码更漂亮。如果不需要这种保存,请参见上面的注释,在这种情况下,您甚至不需要箭头函数。这就是我得到的结果:getNewDataPromise2.then data=>getNewDataPromisedata.then data=>getNewDataPromisedata.then data=>getNewDataPromisedata.then data=>{console.logdata;}.catch err=>{console.logerr;};当然有新词了,谢谢@robbannn和@Mike'Pomax'Kamermans