我正在学习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块。有人可以解释为什么吗?
答案 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)
这个示例官方软件词汇称为“无点编程”。