2018年的Callback vs Promise

时间:2018-08-09 12:25:39

标签: javascript node.js ecmascript-6 promise

制作异步功能的当今标准是什么?

我不是要在这里问基于选项的问题,而是要问2018年使用了什么,以及对将来的可伸缩性有何好处。

样式1:

const client = new SteamUser();
    exports.setup = callback => {
        client.on('webSession', async (sessionID, cookies) => {
            offers.setup(client, cookies, callback);
        });

        client.on('error', err => {
           callback(error)
        });
    };

样式2:

const client = new SteamUser();
    exports.setup = async () => {
        return new Promise(function(resolve, reject){
            client.on('webSession', async (sessionID, cookies) => {
                resolve(await offers.setup(client, cookies));
            });

            client.on('error', err => {
               reject(error)
            });
         });
        };

两者通过以下方式调用了另一个文件:

    try{
await module.setup();
} catch(err){
console.log(err);
}

2 个答案:

答案 0 :(得分:4)

承诺可以帮助您获得更具可读性和可维护性的代码。与回调相比,使用诺言所涉及的嵌套更少。

下面的代码使用回调:

someMethod = (arg) => {
    getSomething1(arg, res1 => {
        getSomething2(res1, res2 => {
            getSomething3(res2, res3 => {
                /* Do something here */
            });
        });
    })
}

上面的代码中嵌套太多:回调内部的回调...(回调地狱)。您拥有的回调越多,阅读起来就越困难。

通过使用Promise,它将变为:

var someMethod = (arg) => {
    getSomething1(arg).then(res1 => {
        return getSomething2(res1);
    }).then(res2 => {
        return getSomething3(res2);
    }).then(res3 => {
       /* Do something here */
    });
}

现在它更易读了,因为promise允许您垂直链接事物。

可以通过使用异步等待来进一步增强它:

someMethod() = async (arg) => {
    var res1 = await getSomething1(arg);
    var res2 = await getSomething2(res1);
    var res3 = await getSomething3(res2); 
    /* Do something here */
}

现在看起来像是一个同步代码:易于阅读和维护。

答案 1 :(得分:-2)

我认为我们应该明确尝试使用try / catch方法。 Pouchdb文档很好地概述了如何以三种可能的不同方式来实现其功能。

回调

db.allDocs({
  include_docs: true,
  attachments: true
}, function(err, response) {
  if (err) { return console.log(err); }
  // handle result
});

承诺

db.allDocs({
  include_docs: true,
  attachments: true
}).then(function (result) {
  // handle result
}).catch(function (err) {
  console.log(err);
});

异步尝试/捕获

try {
  var result = await db.allDocs({
    include_docs: true,
    attachments: true
  });
} catch (err) {
  console.log(err);
}