混淆JS中如何使用Promise

时间:2019-07-24 11:22:28

标签: javascript

我是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()处理的结果”

1 个答案:

答案 0 :(得分:2)

  

我可以将then回调想象为异步回调,就像我们在Promise之前使用的那样吗?

是的。当xhr对象完成并且其结果可用时,它仍然“只是”一个被异步调用的回调。

  

Primise有助于异步操作减少回调函数

是的。您不再需要知道结果的确切来源以及如何获得它,您只需要保证就可以使用它来等待结果。

  

当一个函数返回一个Promise时,返回的Promise会告诉我们“请稍等,我保证我会为您提供可以使用then()处理的结果”

精确地。

  

then()的回调是异步的吗,我是说它也通过事件循环运行吗?

是的。除了XHR异步解决承诺外,所有then回调都是guaranteed to be called asynchronously

  

当我们说一个函数返回一个promise时,是否意味着该promise会立即返回,而不管它是否已解决?

是的。这是一个可观察的句柄。