2016-11-06 2 views
-1

Я новичок в концепции обещаний, а также JavaScript в целом. Я пытаюсь написать функцию в Node.js, чтобы передать URL-адрес обещанию результатов.return new Promise() не работает в Node.js

Я запрограммировал его двумя способами. Первое не работает, в котором я могу передать URL-адрес функции. Второй работает, в котором URL статически определяется. Первый не работает, потому что компилятор не считает, что это функция по какой-то причине, которую я не могу понять, почему?

этот способ не работа как функции getJson не интерпретируется Узлом как функция:

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 является статическим. То, что я пытаюсь сделать, - это связать кучу URL-адресов, взяв результат API, один URL-адрес, который затем содержит 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" 
}); 

ответ

2

Попробуйте это:

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" 
}); 
+0

Большое спасибо. Я думал о том, чтобы поместить функции в функцию, но не был уверен, что это нужно было объявить до того, как была определена функция. То, что вы делаете здесь, работает с одним изменением, которое было моей первоначальной проблемой. У меня было глупо два правильных фигурных скобки во второй, чтобы последняя строка моей функции, и именно поэтому ее не узнавали. Когда я изменил его на}); он работал при использовании вашего вызова. еще раз спасибо – DAB

2
getJson.then(...) 

в первом блоке кода не является правильным. Она должна быть:

getJson(someURL).then(...) 

потому что в первом блоке кода, getJson функция, так что вы должны назвать его, чтобы выполнить его, и вы должны передать ему нужные аргументы.


В своем первом блоке кода, getJson это функция, которая возвращает обещание при вызове и выполнить функцию, так что вы должны вызвать функцию, чтобы получить обещанное. Во втором блоке кода getJson уже является обещанием, поэтому вы можете позвонить getJson.then(...).

+0

Спасибо так много. То, как вы объясняли разницу между ними (первая - это функция, которая возвращает обещание, вторая - обещание) имеет для меня смысл и очищает многое. У меня было глупо два правильных фигурных скобки во второй, чтобы последняя строка моей функции, и именно поэтому ее не узнавали. Когда я изменил его на}); он работал при использовании вашего вызова. Еще раз спасибо – DAB

Смежные вопросы