Javascript Promise:无法从我的函数中获取 return 值
Javascript Promise: can't get the return value out of my function
我无法从我的函数中获取 return 对象,所以我可以在下一个函数中重用它,该函数应该由我的 promise.then()
调用。
苦苦研究,找不到解决办法
engine.log
基本上等同于我应用中的 console.log
。
firstRequest
.then( function (result) {
return secondRequest(result)
},
error => engine.log(error)
)
.then(
result => engine.log(result), // result is undefined, need the object here
)
let firstRequest = new Promise(function(resolve, reject) {
http.simpleRequest({
'method': 'GET',
'url': theUrl,
'dataType': 'json',
'timeout': 6000,
}, function (error, response) {
if (error) {
engine.log("Error: " + error)
reject()
}
if (response.statusCode != 200) {
engine.log("HTTP Error: " + response.status)
reject()
}
myObject = JSON.parse(response.data)
resolve(myObject)
})
});
function secondRequest(request) {
http.simpleRequest({
'method': 'GET',
'url': theSecondUrl,
'dataType': 'json',
'timeout': 6000,
}, function (error, response) {
if (error) {
engine.log("Error: " + error);
}
if (response.statusCode != 200) {
engine.log("HTTP Error: " + response.status);
}
myObject = JSON.parse(response.data)
return myObject // this is not being returned, to the .then()
})
}
Javascript 承诺是异步的。这意味着它们在事件循环中得到解决,如果承诺在您调用 .then()
回调后立即得到解决,那么您将在下一个函数中获得预期的值。
Javascript 做出异步 承诺,因为典型的 API 调用或数据库检索可能涉及网络延迟或 return 的任何其他延迟数据。因此,用户会将这些延迟视为性能问题。为了避免这种影响 Javascript 事件循环 正在按照 运行ning 承诺 异步 的方式执行其工作。这意味着承诺之后的代码很可能是 运行 在它被解决或拒绝之前。因此,当代码为 运行 时,您的下一个函数将没有 first promise 的值。
在事件循环的下一次迭代或 1+ 次迭代中,您的承诺可能会得到 resolved/rejected,然后可能会填充相应的值。
解决方案=>
您应该使用 async await 使 javascript 中的任何异步代码同步。
您可以在此处阅读更多相关信息。
https://javascript.info/async-await
首先,我看到了冗余代码,因此我会将您的请求整合到一个更通用的函数中。您似乎不想这样做,因为您觉得必须将 'request' 参数传递给第二个函数,但请注意您从未使用过它。在这两种情况下只需传递 url 即可。
在你的通用函数中,我在下面调用 'makeRequest',一定要 return 承诺,否则你会得到未定义的。另外,一定要在解析后的对象上调用 resolve
,而不是 return
;
此外,我会为您的错误使用 catch
,这样您就可以在发生错误时捕获它,无论是第一个 then
还是第二个。
顺便说一句,这是未经测试的,但我认为一般要点都在那里。
makeRequest('somewhere')
.then(result => makeRequest('theSecondUrl'))
.then(result => engine.log(result))
.catch(error => engine.log(error));
function makeRequest (url, method, datatype, timeout) {
return new Promise(function(resolve, reject) {
http.simpleRequest({
'method': method || 'GET',
'url': url,
'dataType': datatype || 'json',
'timeout': timeout || 6000,
}, function (error, response) {
if (error) {
engine.log("Error: " + error)
reject()
}
if (response.statusCode != 200) {
engine.log("HTTP Error: " + response.status)
reject()
}
// use 'let' or else you've made a globally scoped variable
let parsed = JSON.parse(response.data)
resolve(parsed);
});
})
}
我无法从我的函数中获取 return 对象,所以我可以在下一个函数中重用它,该函数应该由我的 promise.then()
调用。
苦苦研究,找不到解决办法
engine.log
基本上等同于我应用中的 console.log
。
firstRequest
.then( function (result) {
return secondRequest(result)
},
error => engine.log(error)
)
.then(
result => engine.log(result), // result is undefined, need the object here
)
let firstRequest = new Promise(function(resolve, reject) {
http.simpleRequest({
'method': 'GET',
'url': theUrl,
'dataType': 'json',
'timeout': 6000,
}, function (error, response) {
if (error) {
engine.log("Error: " + error)
reject()
}
if (response.statusCode != 200) {
engine.log("HTTP Error: " + response.status)
reject()
}
myObject = JSON.parse(response.data)
resolve(myObject)
})
});
function secondRequest(request) {
http.simpleRequest({
'method': 'GET',
'url': theSecondUrl,
'dataType': 'json',
'timeout': 6000,
}, function (error, response) {
if (error) {
engine.log("Error: " + error);
}
if (response.statusCode != 200) {
engine.log("HTTP Error: " + response.status);
}
myObject = JSON.parse(response.data)
return myObject // this is not being returned, to the .then()
})
}
Javascript 承诺是异步的。这意味着它们在事件循环中得到解决,如果承诺在您调用 .then()
回调后立即得到解决,那么您将在下一个函数中获得预期的值。
Javascript 做出异步 承诺,因为典型的 API 调用或数据库检索可能涉及网络延迟或 return 的任何其他延迟数据。因此,用户会将这些延迟视为性能问题。为了避免这种影响 Javascript 事件循环 正在按照 运行ning 承诺 异步 的方式执行其工作。这意味着承诺之后的代码很可能是 运行 在它被解决或拒绝之前。因此,当代码为 运行 时,您的下一个函数将没有 first promise 的值。 在事件循环的下一次迭代或 1+ 次迭代中,您的承诺可能会得到 resolved/rejected,然后可能会填充相应的值。
解决方案=>
您应该使用 async await 使 javascript 中的任何异步代码同步。
您可以在此处阅读更多相关信息。 https://javascript.info/async-await
首先,我看到了冗余代码,因此我会将您的请求整合到一个更通用的函数中。您似乎不想这样做,因为您觉得必须将 'request' 参数传递给第二个函数,但请注意您从未使用过它。在这两种情况下只需传递 url 即可。
在你的通用函数中,我在下面调用 'makeRequest',一定要 return 承诺,否则你会得到未定义的。另外,一定要在解析后的对象上调用 resolve
,而不是 return
;
此外,我会为您的错误使用 catch
,这样您就可以在发生错误时捕获它,无论是第一个 then
还是第二个。
顺便说一句,这是未经测试的,但我认为一般要点都在那里。
makeRequest('somewhere')
.then(result => makeRequest('theSecondUrl'))
.then(result => engine.log(result))
.catch(error => engine.log(error));
function makeRequest (url, method, datatype, timeout) {
return new Promise(function(resolve, reject) {
http.simpleRequest({
'method': method || 'GET',
'url': url,
'dataType': datatype || 'json',
'timeout': timeout || 6000,
}, function (error, response) {
if (error) {
engine.log("Error: " + error)
reject()
}
if (response.statusCode != 200) {
engine.log("HTTP Error: " + response.status)
reject()
}
// use 'let' or else you've made a globally scoped variable
let parsed = JSON.parse(response.data)
resolve(parsed);
});
})
}