我是JS的新手,正在学习Promise及其在JS中的用法,我想问一些问题。首先,如果您看下面的代码:
var makeRequest = function (url, method) {
// Create the XHR request
var request = new XMLHttpRequest();
// Return it as a Promise
return new Promise(function (resolve, reject) {
// Setup our listener to process compeleted requests
request.onreadystatechange = function () {
// Only run if the request is complete
if (request.readyState !== 4) return;
// Process the response
if (request.status >= 200 && request.status < 300) {
// If successful
resolve(request);
} else {
// If failed
reject({
status: request.status,
statusText: request.statusText
});
}
};
// Setup our HTTP request
request.open(method || 'GET', url, true);
// Send the request
request.send();
});
};
makeRequest('https://some-url.com/posts')
.then(function (posts) {
console.log('Success!', posts);
})
.catch(function (error) {
console.log('Something went wrong', error);
});
我要问的第一个问题是关于then()的回调,我的意思是我们在then()内部使用的回调,例如then((data)=> {console.log(data)} < / strong>)。我是否可以将其想象为我们在promise之前使用的异步回调,即等待异步的回调,例如xhr对象完成并返回结果。并且,在promise中,then()的回调要等到promise给出结果后,该结果才表示承诺会从异步操作中减少回调函数。第二个问题是then()的回调是异步的,我的意思是,它是否也通过事件循环以及承诺包装的异步代码或承诺包装的代码(例如xhr对象)运行,是承诺中唯一的异步?第三个问题,当我们说函数返回promise时,是否意味着promise立即返回,而不管它是否已解决。我能想象这样当函数返回promise时,返回的promise告诉我们“请稍等,我保证我会为您提供可以使用then()处理的结果”
答案 0 :(得分:2)
我可以将
then
回调想象为异步回调,就像我们在Promise之前使用的那样吗?
是的。当xhr对象完成并且其结果可用时,它仍然“只是”一个被异步调用的回调。
Primise有助于异步操作减少回调函数
是的。您不再需要知道结果的确切来源以及如何获得它,您只需要保证就可以使用它来等待结果。
当一个函数返回一个Promise时,返回的Promise会告诉我们“请稍等,我保证我会为您提供可以使用then()处理的结果”
精确地。
then()
的回调是异步的吗,我是说它也通过事件循环运行吗?
是的。除了XHR异步解决承诺外,所有then
回调都是guaranteed to be called asynchronously。
当我们说一个函数返回一个promise时,是否意味着该promise会立即返回,而不管它是否已解决?
是的。这是一个可观察的句柄。