首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步函数内部承诺

异步函数内部承诺
EN

Stack Overflow用户
提问于 2017-03-16 08:32:40
回答 2查看 1.8K关注 0票数 1

以下是我的情况:

代码语言:javascript
运行
复制
fetchData(foo).then(result => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(result + bar);
        }, 0)
    });
}).then(result => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve( result + woo);
        }, 0)
    });
}).then(result => {
    setTimeout(() => {
        doSomething(result);
    }, 0)
});

其中,每个setTimeout都是使用回调模式的不同异步操作。

将每个函数封装在一个承诺中是非常痛苦的,我觉得代码应该更像这样:

代码语言:javascript
运行
复制
fetchData(foo).then(result => {
    setTimeout(() => {
        return result + bar;
    }, 0)
}).then(result => {
    setTimeout(() => {
        return result + woo;
    }, 0)
}).then(result => {
    setTimeout(() => {
        doSomething(result);
    }, 0)
});

很明显这不管用。

我用的是承诺对吧?我真的必须用承诺包装所有现有的异步函数吗?

编辑:

实际上,我意识到我的示例并不完全代表我的情况,我没有清楚地表明,我的示例中的setTimeout是用来表示异步操作的。这种情况更能代表我的情况:

代码语言:javascript
运行
复制
fetchData(foo).then(result => {
    return new Promise((resolve, reject) => {
        asyncOperation(result, operationResult => {
            resolve(operationResult);
        }, 0)
    });
}).then(result => {
    return new Promise((resolve, reject) => {
        otherAsyncOperation(result, otherAsyncResult => {
            resolve( otherAsyncResult);
        }, 0)
    });
}).then(result => {
        doSomething(result);
});
EN

Stack Overflow用户

发布于 2017-03-16 14:12:23

你用的是承诺。只是在第一个代码片段上做了一个小小的说明:您不会返回最后一个then()回调的承诺:

代码语言:javascript
运行
复制
...
}).then(result => {
    setTimeout(() => {
        doSomething(result);
    }, 0)
});

如果只需要执行异步操作,而不返回到fetchData调用方上一个异步操作的值,则这是正确的。如果您需要返回此值,则还需要进行转换以承诺此操作:

代码语言:javascript
运行
复制
fetchData(foo).then(result => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(result + bar);
        }, 0)
    });
}).then(result => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(result + woo);
        }, 0)
    });
}).then(result => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(doSomething(result));
        }, 0)
    });  
});

这里我假设doSomething是一个同步函数,返回一个值。

这样说,如果您想减少每次创建包装setTimeout的承诺所带来的噪音,可以创建一个实用函数setTimeoutWithPromise

代码语言:javascript
运行
复制
function setTimeoutWithPromise(operation, millisec) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(operation());
        }, millisec)
    });
}

清理你的代码:

代码语言:javascript
运行
复制
fetchData(foo)
    .then(result => setTimeoutWithPromise(() => result + bar, 0))
    .then(result => setTimeoutWithPromise(() => result + woo, 0))
    .then(result => setTimeoutWithPromise(() => doSomething(result), 0));
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42828856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档