一个简单的promise例子,如何用非promise,回调的方式进行改写

发布于 2022-09-11 19:45:51 字数 1790 浏览 12 评论 0

背景如下:最近新学js,然后看了promise方面的教程,了解到目的是为了解决回调问题,但其实回调的痛点我也没怎么搞清楚,所以想写一个试试看,发现自己写的不够好,耦合很严重,大神帮忙纠正一下哈

以下是原来的promise的例子

//做饭
function cook(){
    console.log('开始做饭。');
    var p = new Promise(function(resolve, reject){        //做一些异步操作
        setTimeout(function(){
            console.log('做饭完毕!');
            resolve('鸡蛋炒饭');
        }, 1000);
    });
    return p;
}
 
//吃饭
function eat(data){
    console.log('开始吃饭:' + data);
    var p = new Promise(function(resolve, reject){        //做一些异步操作
        setTimeout(function(){
            console.log('吃饭完毕!');
            resolve('一块碗和一双筷子');
        }, 2000);
    });
    return p;
}
 
function wash(data){
    console.log('开始洗碗:' + data);
    var p = new Promise(function(resolve, reject){        //做一些异步操作
        setTimeout(function(){
            console.log('洗碗完毕!');
            resolve('干净的碗筷');
        }, 2000);
    });
    return p;
}
//使用then
cook()
.then(function(data){
    return eat(data);
})
.then(function(data){
    return wash(data);
})
.then(function(data){
    console.log(data);
});

下面是我改成的非promoise形式如下,本来想写成cook(eat(wash))的形式,怎么都调不对,麻烦大神看看,怎么写的更加好一些

var cook=function (callback) {
    console.log("开始做饭");
    setTimeout(
        ()=>{
            var data="做饭好了"
            console.log(data);
            callback(data);
        },1000
    )
}

var eat=function () {
    console.log("开始吃饭");
    setTimeout(
        ()=>{
            var data="吃好了"
            console.log(data);
            wash();
        },1000
    )
}

var wash=function () {
    console.log("开始洗完");
    setTimeout(
        ()=>{
            var data="洗好了"
            console.log(data);
            //callback(data);
        },1000
    )
}


cook(eat);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

楠木可依 2022-09-18 19:45:51

当 cook(eat(wash)) 没有按 cook > eat > wash 的顺序执行控制台打印函数的时候,题主已经在触感受回调的痛点了。
采用嵌套达到多层链式调用的效果,可以通过返回函数执行句柄的方式:

const eat = () => {
    const handler = {
        then: callback => handler.then = callback
    };
    setTimeout(() =>{
        handler.then instanceof Function && handler.then()
    }, 1000);
    return handler
}

这样就可以 cook.then(eat.then(wash)) 嵌套达到链式调用的效果,但是有点东施效颦的味道。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文