这看起来是Promise对象的一个很好的应用。 Promises通过提供异步计算的公共接口来提高回调函数的可重用性。不必让每个函数都接受一个回调参数,Promises允许您将函数的异步部分封装在Promise对象中。然后,您可以使用Promise方法(Promise.all,Promise.prototype.then)将异步操作链接在一起。以下是您的示例如何翻译:
function getData(url) {
return new Promise(function (resolve, reject) {
});
}
function parseData(data) {
return new Promise(function (resolve, reject) {
});
}
getData("someurl").then(parseData).then(function (data) {
console.log(data);
});
getData("someurl").then(function (data) {
console.log(parseData(data));
});
此外,我应该指出,Promise 目前在浏览器中的支持不太好。幸运的是,有很多 polyfill,比如
this one,它们提供了与原生 Promise 相同的大部分功能。
编辑:
或者,不改变 Function.prototype,我们可以实现一个链式方法,该方法接受一系列异步函数和一个种子值作为输入,并将该种子值通过每个异步函数:
function chainAsync(seed, functions, callback) {
if (functions.length === 0) callback(seed);
functions[0](seed, function (value) {
chainAsync(value, functions.slice(1), callback);
});
}
chainAsync("someurl", [getData, parseData], function (data) {
console.log(data);
});
再次编辑:
上述解决方案远非强大可靠,如果您需要更全面的解决方案,请查看类似 https://github.com/caolan/async 的内容。
getData.then()
不会涉及调用函数getData()
。我认为你的方法有误。 - Pointy.promisify()
方法将为您完成所有这些工作,然后您可以执行类似于getDataAsync(...).then(parseDataAsync)
的操作。如果您想自己实现该功能而不使用第三方库,则可以查看Bluebird中的实现方式并从中学习。 - jfriend00parseData
无法从getData
中获取结果。 - hjl