我是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(基准)})
答案 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
(除非某些精美的库使它对您而言是同步的)。