承诺不就是回调吗? [英] Aren't promises just callbacks?

查看:28
本文介绍了承诺不就是回调吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经开发 JavaScript 好几年了,我完全不理解关于 promise 的大惊小怪.

I've been developing JavaScript for a few years and I don't understand the fuss about promises at all.

似乎我所做的就是改变:

It seems like all I do is change:

api(function(result){
    api2(function(result2){
        api3(function(result3){
             // do work
        });
    });
});

无论如何,我可以使用像 async 这样的库,例如:

Which I could use a library like async for anyway, with something like:

api().then(function(result){
     api2().then(function(result2){
          api3().then(function(result3){
               // do work
          });
     });
});

代码较多,可读性较差.我在这里没有得到任何东西,它也不会突然神奇地平坦".更不用说必须将事情转换为承诺.

Which is more code and less readable. I didn't gain anything here, it's not suddenly magically 'flat' either. Not to mention having to convert things to promises.

那么,这里的承诺有什么大惊小怪的?

So, what's the big fuss about promises here?

推荐答案

Promise 不是回调.承诺表示异步操作的未来结果.当然,按照您的方式编写它们,您几乎没有什么好处.但是,如果您按照它们的使用方式编写它们,则可以以类似于同步代码的方式编写异步代码,并且更易于遵循:

Promises are not callbacks. A promise represents the future result of an asynchronous operation. Of course, writing them the way you do, you get little benefit. But if you write them the way they are meant to be used, you can write asynchronous code in a way that resembles synchronous code and is much more easy to follow:

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
});

当然,代码不是更少,而是可读性更高.

Certainly, not much less code, but much more readable.

但这还不是结束.让我们发现真正的好处:如果您想检查任何步骤中的任何错误怎么办?用回调来做这件事会很糟糕,但用承诺,是小菜一碟:

But this is not the end. Let's discover the true benefits: What if you wanted to check for any error in any of the steps? It would be hell to do it with callbacks, but with promises, is a piece of cake:

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
}).catch(function(error) {
     //handle any error that may occur before this point
});

try { ... } catch 块几乎相同.

更好:

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
}).catch(function(error) {
     //handle any error that may occur before this point
}).then(function() {
     //do something whether there was an error or not
     //like hiding an spinner if you were performing an AJAX request.
});

甚至更好:如果这 3 个对 apiapi2api3 的调用可以同时运行会怎样(例如,如果它们是 AJAX 调用)但是你需要等待三个吗?没有承诺,你应该创建某种计数器.使用 ES6 表示法的 promise 是另一块蛋糕,而且非常整洁:

And even better: What if those 3 calls to api, api2, api3 could run simultaneously (e.g. if they were AJAX calls) but you needed to wait for the three? Without promises, you should have to create some sort of counter. With promises, using the ES6 notation, is another piece of cake and pretty neat:

Promise.all([api(), api2(), api3()]).then(function(result) {
    //do work. result is an array contains the values of the three fulfilled promises.
}).catch(function(error) {
    //handle the error. At least one of the promises rejected.
});

希望您现在以全新的眼光看待 Promise.

Hope you see Promises in a new light now.

这篇关于承诺不就是回调吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆