我对promises的概念以及JavaScript的新概念都是新的。我试图在Node.js中编写一个函数,我可以将URL传递给结果的承诺。
我已经将它编程为两种方式。第一个不起作用,我可以将URL传递给函数。第二个确实有效,其中URL是静态定义的。第一个不起作用,因为编译器不认为它是一个函数,由于某种原因我无法弄清楚,为什么?
由于函数getJson
不被Node解释为函数,所以这样做是可行的:
var options = { method: 'GET',
url: URL, // This will be dynamically filled by the argument to the function getJson
headers: { authorization: 'OAuth realTokenWouldBeHere', Accept: 'application/json' } };
var getJson = function(URL){
return new Promise(function(resolve, reject) {
request(options, function (error, response, body) {
if(error) reject(error);
else {
resolve(JSON.parse(body)); //The body has an array in the jason called Items
}
});
}); // Edited original post. Had two curly braces }}; here by accident, which was why function was not being recognized
};
getJson.then(function(result) {
console.log(result.Items); // "Stuff worked!"
}, function(err) {
console.log(err); // Error: "It broke"
});
这种方式可行,我将一个项目阵列带回到控制台。这样做的缺点是使用的URL是静态的。我想要做的是通过获取API的结果链接一堆URL,一个URL调用然后包含结果的NextPage的URL。
var options = { method: 'GET',
url: 'http://staticURL',
headers: { authorization: 'OAuth realTokenWouldBeHere', Accept: 'application/json' } };
var getJson = new Promise(function(resolve, reject) {
request(options, function(err, response, body) {
if(err) reject(err);
else {
resolve(JSON.parse(body));
}
});
});
getJson.then(function(result) {
console.log(result.Items); // "Stuff worked!"
}, function(err) {
console.log(err); // Error: "It broke"
});
答案 0 :(得分:4)
试试这个:
var getJson = function(URL){
var options = {
method: 'GET',
url: URL,
headers: { authorization: 'OAuth realTokenWouldBeHere', Accept: 'application/json' }
};
return new Promise(function(resolve, reject) {
request(options, function (error, response, body) {
if(error) reject(error);
else {
resolve(JSON.parse(body));
}
});
}};
};
然后你可以称之为:
getJson(theDynamicURLGoesHere).then(function(result) {
console.log(result.Items); // "Stuff worked!"
}, function(err) {
console.log(err); // Error: "It broke"
});
答案 1 :(得分:2)
getJson.then(...)
第一个代码块中的不正确。它必须是:
getJson(someURL).then(...)
因为在第一个代码块中,getJson
是一个函数,所以你必须调用它来执行它,你需要传递它所需的参数。
在您的第一个代码块中,getJson
是一个函数,当您调用并执行函数时返回一个promise,因此您必须调用该函数才能获得承诺。在第二个代码块中,getJson已经是一个promise,因此您可以调用getJson.then(...)
。
答案 2 :(得分:0)
getJson()
是一个函数,因此您需要使用()
来调用它:
getJson(URL).then(onFulfilled, onRejected);
要注意的重要一点是,create a new promise using a constructor是您的承诺,是一个对象。不要尝试将Promise用作函数-Promise立即开始执行,.then()
只是注册一个事件处理程序,以便您在Promise更改状态时得到通知。