究竟是什么时候创建了JavaScript承诺?

时间:2017-12-03 03:41:35

标签: javascript promise es6-promise

我在React代码中使用了一段时间的promises。但我必须包含babel polyfill库以支持不支持最新JavaScript ES6的浏览器的promises和map函数,让我们称之为旧浏览器。

现在令我困惑的是如何在旧浏览器中编写异步函数。 Internet Explorer不支持异步,所以它们是如何编写的? 我还读过,承诺本身不是异步,而是管理异步功能的工具。那么,如果开发人员想要开发自己的承诺功能,那么核心异步函数是什么? setTimeout函数只能这样做吗?

1 个答案:

答案 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();
});