考虑以下使用回调编写的函数。它返回一个令牌并异步执行一个方法。
var token = 1;
function requestSupport(callback) {
setTimeout(() => {
console.log(token + ":How may I help you?");
callback(); //when executive is available
}, 5000);
return ++token; //instantly give the token number
}
回调的简便之处在于该函数能够(立即)返回令牌号,并且还可以异步执行代码并在有帮助时发出通知。尝试使用Promises重写时,此函数应该是什么样? 问题:如果一个函数返回一个Promise,则用户将不会获得令牌号,因为一个函数可以返回一件事。
答案 0 :(得分:4)
您想同时返回令牌和Promise-您可以使用所需的任何数据结构(也许是对象)来完成此操作:
var token = 1;
function requestSupportProm() {
const prom = new Promise((resolve) => {
setTimeout(() => {
console.log(token + ":How may I help you?");
resolve(); //when executive is available
}, 2000);
});
return {
prom,
token: ++token
};
}
(() => {
// later;
const { prom, token } = requestSupportProm();
console.log('Got token:', token);
prom.then(() => {
console.log('Promise resolved');
});
})();
也可以使用数组,例如return [prom, ++token]
,但是具有命名属性的对象一目了然可能更容易理解。