承诺,获取,代码风格。请解释.then(checkStatus).then(parseJSON)

时间:2016-12-01 12:09:23

标签: javascript promise fetch

我有测试代码!

function checkStatus(response) {
    if (response.status >= 200 && response.status < 300) {
        return Promise.resolve(response)
    } else {
        return Promise.reject(new Error(response.statusText));
    }
}
function parseJSON(response) {
    return response.json()
}

我可以这样写:

function load(id) {
    return fetch('/api/test/'+ id + '/', {method: 'get'})
                .then(response => checkStatus(response))
                .then(response =>  parseJSON(response))
                .catch(error=>console.error(error))

或者我可以像那样写:

function load(id) {
    return fetch('/api/test/'+ id + '/', {method: 'get'})
                .then(checkStatus)
                .then(parseJSON)
                .catch(error=>console.error(error))

请解释第二个变体。 .then(checkStatus) .then(parseJSON)如何运作? 我只是写了对函数的引用,而不是运行它。

1 个答案:

答案 0 :(得分:3)

.then将函数作为参数...它调用函数传递一个参数,该参数是promise的解析值

所以想想

return fetch('/api/test/'+ id + '/', {method: 'get'})
.then(checkStatus)

作为

return fetch('/api/test/'+ id + '/', {method: 'get'})
.then(function(resultOfPromise) {
     return checkStatus(resultPromise);
})
  

顺便说一句,这不仅限于承诺/然后输入代码......请考虑以下

function doThings(p1) {
    console.log(p1);
    return 'good bye';
}
setTimeout(doThings, 1000, "hello world");
  

相同的概念 - 除了setTimout中回调返回的值被忽略。但是在.then()中,回调返回的值被用作Promise的解析值...这基本上是promise链的工作原理(这是一个过于简化的解释)