我在React代码中使用了一段时间的promises。但我必须包含babel polyfill库以支持不支持最新JavaScript ES6的浏览器的promises和map函数,让我们称之为旧浏览器。
现在令我困惑的是如何在旧浏览器中编写异步函数。 Internet Explorer不支持异步,所以它们是如何编写的?
我还读过,承诺本身不是异步,而是管理异步功能的工具。那么,如果开发人员想要开发自己的承诺功能,那么核心异步函数是什么?
setTimeout
函数只能这样做吗?
答案 0 :(得分:2)
在没有承诺的情况下处理异步函数的常用方法是使用回调函数。这方面的一个例子是你提到的setTimeout
函数(参见MDN上的文档),它将一个(回调)函数作为它的第一个参数,当计时器完成时将调用它。 / p>
还有许多以这种方式设计的其他功能,可能最值得注意的是AJAX API:XMLHttpRequest
。这允许您注册事件侦听器(a.k.a.回调函数),这些函数在AJAX调用完成时调用:
var oReq = new XMLHttpRequest();
oReq.addEventListener("progress", updateProgress);
oReq.addEventListener("load", transferComplete);
oReq.addEventListener("error", transferFailed);
oReq.addEventListener("abort", transferCanceled);
oReq.open();
说到事件监听器,标准DOM事件监听器也是使用回调处理的异步的示例。以下是点击事件的示例(同样来自MDN):
<div id="test"></div>
<script>
document.getElementById("test").addEventListener("click", function( event ) {
// display the current click count inside the clicked div
event.target.textContent = "click count: " + event.detail;
}, false);
</script>
那么,承诺会在哪里进入这个故事? Promises是一个相当简单的抽象,它(至少在JS中)构建在回调之上。换句话说,(几乎)所有承诺API函数在JS调用函数中,如上所述,在幕后。
通过给予执行者来构造promise,执行者将获得两个回调函数,一个用于表示信号成功(并返回一个值),resolve
和一个用于失败,reject
:
var p = new Promise( /* executor */ function(resolve, reject) { ... } )
例如,我们可以构建一个这样的计时器保证:
new Promise(function(resolve,reject) {setTimeout(resolve, delay);};
或像这样的AJAX承诺:
new Promise(function(resolve, reject) {
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", resolve);
oReq.addEventListener("error", reject);
oReq.addEventListener("abort", reject);
oReq.open();
});