了解Node JS中的Promise?

时间:2019-06-14 06:26:43

标签: node.js promise es6-promise node-modules

我正在学习Node js中的Promise,我编写了如下代码。

var request = require("request");
var userDetails;

function getData(url) {
    // Setting URL and headers for request
    var options = {
        url: url,
        headers: {
            'User-Agent': 'request'
        }
    };
    // Return new promise 
    return new Promise(function (resolve, reject) {
        // Do async job
        request.get(options, function (err, resp, body) {
            if (err) {
                reject(err);
            } else {
                resolve(body);
            }
        })
    })
}

var errHandler = function (err) {
    console.log(err);
}

function main() {
    var userProfileURL = "https://api.githshub.com/users/narenaryan";
    var dataPromise = getData(userProfileURL);
    // Get user details after that get followers from URL
    var whichPromise = dataPromise.then(JSON.parse)
        .then(function (result) {
            userDetails = result;
            // Do one more async operation here
            console.log("then1")
            var anotherPromise = getData(userDetails.followers_url).then(JSON.parse);
            return anotherPromise;
        })
        .then(function (data) {
            return data
        });
    console.log(whichPromise)

    whichPromise.then(function (result) {
        console.log("result is" + result)

    }).catch(function (error) {
        console.log("Catch" + error)
    });
}


main();

现在这很好用。我对此有疑问。

1。JSON.Parse如何解析数据而不在参数中获取json字符串。

var whichPromise = dataPromise.then(JSON.parse)

2。如果我在下面的行中输入错误的网址

var userProfileURL = "https://api.githshub.com/users/narenaryan";

然后它被阻止将无法工作,因为DNS无法解析并且应该会收到错误消息,这意味着

 var anotherPromise = getData(userDetails.followers_url).then(JSON.parse);
            return anotherPromise;

将不返回任何值,并且whichPromise将没有任何引用。

但是如果调用下面的代码

whichPromise.then(function (result) {
        console.log("result is" + result)

    }).catch(function (error) {
        console.log("Catch" + error)
    });

在此处 whichPromise 可以调用catch块。有人可以解释为什么吗?

2 个答案:

答案 0 :(得分:1)

  

JSON.Parse如何能够解析数据而不在参数中获取json字符串。

     

var whichPromise = dataPromise.then(JSON.parse)

.then()希望您将其传递给函数。当诺言解决时,它将调用该函数并将其传递给诺言的已解决值。

因此,您将其传递给JSON.parse函数,然后它将调用该函数并将其promise的结果值传递给它,即您的JSON字符串。执行该函数的返回值将成为链中所得promise的已解析值。因此,在您的情况下,JSON.parse()返回的Javascript对象将成为您的Promise链的已解析值。

  

如果我在...中输入了错误的URL

错误的URL显然不会获取您想要的数据。根据错误的URL,它将创建网络错误(例如解析主机的DNS错误)或返回404错误(该主机上没有此类路径),或者服务器可能返回其他类型的响应。从request.get()返回的确切内容取决于您传递给request.get()的选项以及URL错误的确切方式。在某些情况下,承诺将被拒绝,在这种情况下,您的.then()处理程序将不会被调用。在其他情况下,promise可能仍会解决,但不会有任何数据或不正确的JSON传递给JSON.parse()会导致其他错误。

重要的是要理解,当您使用http请求发送无效路径时,取回404响应代码并不被许多库视为HTTP错误。您到达了服务器,向它发送了一个请求,它处理了该请求并返回了响应。尽管响应可能是404状态代码,但不一定认为是错误。因此,您自己的代码必须配置用于强制404或任何4xx的http库,或者必须对其进行显式检查以便正确处理。

答案 1 :(得分:1)

让我们逐步了解它。

1

=> dataPromise.then(JSON.parse)

这等于写作

=> dataPromise.then(data => JSON.parse(data))

因为,JSON.parse是一种将一些数据(字符串)作为第一个输入并返回已解析的JS-Object的方法。但是,从清晰的角度来看,这是一个纯粹的功能。

我在第二行中为清除您的概念做了什么,我通过了匿名箭头函数,该函数也将arg(数据)作为第一个arg,并返回JS.parse()方法返回的内容。 因此,我们正在创建一个额外的层或执行上下文。这种额外的上下文称为“点”

=> dataPromise.then(data => JSON.parse(data))带附加功能层

=> dataPromise.then(JSON.parse)直接传递了JSON.parse(arg => parsedObj)

这个示例官方软件词汇称为“无点编程”。