javascript - 将 Promise 分配给变量并在链中返回与仅返回 Promise 调用不同吗?

标签 javascript promise

这两个链的处理方式有什么不同或者处理方式相同吗?使用其中一种比另一种有什么好处吗?

我尝试了这两个调用,它们都返回相同的结果 (32) - 我的假设是它们以相同的方式处理,但我有一个 friend 告诉我它们的工作方式不同。

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

最佳答案

就结果而言,您的两个版本之间完全没有区别。第一个只是创建一个中间局部变量,它不会影响结果或并行性或您的 friend 断言的任何内容。

您的第二个更简洁、同样清晰,是我在你们两个之间的偏好。

<小时/>

另一种选择是使用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);
    }
}

关于javascript - 将 Promise 分配给变量并在链中返回与仅返回 Promise 调用不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57735459/

相关文章:

改变按钮颜色的Javascript函数

javascript - 固定分辨率的大 svg 到 png

javascript - 如何获取 select jquery 对象的选定选项的文本值?

javascript - 为什么 Promise.then() 中的代码没有被调用?

javascript - 为什么htmlunit的结果和chrome的结果不一样?

Javascript多维数组不起作用

javascript - 使用 Promise/Bluebird 进行并行 Mongoose 查询?

javascript - React Promise 代码需要更改 json 值

javascript - 使用新的 fetch API 时如何缓存 Promise?

javascript - 使用 axios 递归获取数据并链接结果