对诺言如何异步工作的困惑

时间:2019-07-22 04:07:15

标签: javascript promise

我是JS的新手,正在学习诺言。如您所见,下面的代码:

function makeRequest (method, url) {
  return new Promise(function (resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.open(method, url);
    xhr.onload = function () {
      if (this.status >= 200 && this.status < 300) {
        resolve(xhr.response);
      } else {
        reject({
          status: this.status,
          statusText: xhr.statusText
        });
      }
    };
    xhr.onerror = function () {
      reject({
        status: this.status,
        statusText: xhr.statusText
      });
    };
    xhr.send();
  });
}

// Example:

makeRequest('GET', 'http://example.com')
.then(function (datums) {
  console.log(datums);
})
.catch(function (err) {
  console.error('Augh, there was an error!', err.statusText);
});

我想对上述代码的工作提出一些问题。因此,当我们执行以上代码时,它将立即返回promise(因为它不是异步的),但是xhr对象将通过事件循环执行。问题是then()到底发生了什么异步,我的意思是,在我们感谢xsolve从xhr对象获得数据之后,当将由resolve(xhr.response)处理的数据传递给then()时,异步发生了吗? 第二个问题,为什么我们需要在then()中再实现一次异步,因为我们已经从异步xhr中获得了数据,所以我们只需要显示.then((datums){console.log(基准)})

1 个答案:

答案 0 :(得分:0)

代码的工作方式是返回承诺。这意味着仅在调用该函数时才执行该Promise中的代码-是的,该函数 是异步的,因为它返回了Promise。因此,您需要使用RB等待函数返回的promise解决或拒绝,然后然后执行传递的回调函数中包含的代码。

这个特殊的代码示例有些令人困惑,因为通常在处理AJAX,XMLHttpRequest和Fetch API时,您通常不会构建诺言-您只会使用API​​创建的诺言。这是一个涉及Fetch API的简单示例:

.then

在这里,发生的事情是Fetch API向所需的页面(function generatePromise() { return fetch("http://example.com"); } generatePromise().then(res => console.log(res), err => console.log(err)); )发出请求,并从该函数返回待处理的Promise。此承诺是由Fetch API构建的-在这种情况下,开发者是承诺的消费者,而不是生产者。

由于http://example.com返回了generatePromise,因此我们需要使用Promise <pending>来等待它完成。完成后,我们将传递两个函数(您可以使用此方法,或者使用.then.then每个都有一个回调)-第一个是成功函数,如果promise是{ {1}} d。第二个是失败函数,如果已经.catch了承诺,就会调用它。

需要resolve等待诺言完成,否则我们将在没有数据的情况下工作,这通常是请求的重点。在处理Promise时,您总是需要这些reject / .then(除非某些精美的库使它对您而言是同步的)。