我已经通过使用let定义了一个函数,然后创建了一个函数。 此函数将发布请求发送到api,并以json格式获取数据。在此函数中,我使用了一个变量并将其设置为等于响应的值。
当我使用此功能时,一切正常。 当我在函数外使用此变量时,我得到的值不确定''
下面是我的代码
var request = require("request");
let conkey = 'Some Value', //varialble for consumer_key
consec = 'Some Value', //varialble for consumer_secret
tkn = 'Some Value', //varialble for token
tknsec = 'Some Value',
value;
function myFunction() {
request.post('someurl', {
oauth: {
consumer_key: conkey,
consumer_secret: consec,
token: tkn,
token_secret: tknsec
},body: {"skillIds": [some value]
},json: true}, function (err, res, body) {
if (err) throw new Error(err);
value = body.sonething.something;
console.log(value); ////THIS WORKS FINE
});
};
myFunction();
console.log(value); ////This prints Undefined
答案 0 :(得分:1)
发生这种情况是因为request.post
是异步操作。这意味着它将最终完成,但不会立即完成。这就是request.post
接受一个称为回调函数的函数的原因。
function (err, res, body) { ... }
仅在请求完成时被调用。
让我们按顺序浏览您的代码...它将首先:
1-创建变量。
2-定义myFunction
3-呼叫myFunction
。 myFunction
将呼叫request.post
。但是request.post
是异步的。这意味着它将在得到结果之前立即返回。 myFunction
现在退出。
4-现在调用console.log(value);
,但是此时value
是不确定的。
5-请求完成后,function (err, res, body)
(在request.post
调用中定义)将执行
value = body.sonething.something;
console.log(value);
现在将在此处定义value
。
希望这会有所帮助。
答案 1 :(得分:0)
您可以尝试使用基于承诺的js 获取API ,它将帮助您解决问题。 或其他一些辅助库,例如 axios 。
问题在于,您的代码不会在您的响应更改“值”的“值”之前等待接收到请求和console.logs。这就是为什么我认为您不确定。
答案 2 :(得分:0)
感谢大家的回答。 通过在函数外部创建一个空对象并使用函数将值插入到空对象中,可以解决该问题。