javascript - Javascript Promise:无法从我的函数中获取返回值
问题描述
我无法从我的函数中获取返回对象,因此我可以在下一个函数中重用它,该函数应该由我的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 调用或数据库检索可能涉及网络延迟或返回数据的任何其他延迟。因此,用户会将这些延迟视为性能问题。为了避免这种影响,Javascript事件循环正在执行异步运行 Promise 的工作。这意味着承诺之后的代码很可能在它被解决或拒绝之前运行。因此,您的下一个函数在其代码运行时将不具有第一个承诺的值。在事件循环的下一次迭代或 1+ 次迭代中,您的承诺可能会被解决/拒绝,然后可能已经填充了相应的值。
解决方案 =>
您应该使用 async await 使任何异步代码在 javascript 中同步。
你可以在这里阅读更多关于它的信息。 https://javascript.info/async-await
推荐阅读
- clojure - 如何获取 (.getBytes "string "UTF-8) 返回的字节数组的长度?
- arm - 用于 u-boot 的 linux 内核的内存位置
- sql-server - vb.net,sql命令代码中的数据类型不兼容
- python - 断言错误 (-215) npoints >= 0 并且从验证码图像中提取字母时出错
- python - 合并csv文件时删除列并替换不同列中的标题
- angular - 根据条件切换Validatos.required,angular6
- matlab - 尝试读取大数据文件并将其存储在工作区中,以便其他功能可以使用它
- ruby - 如何在 ruby 客户端脚本中安全地存储身份验证凭据?
- c++ - 从服务调用的 VirtualProtectEx 返回 false,但 GetLastError 为 0(成功)
- ruby - 在 Windows 10 的 Ubuntu 上安装 Ruby 时,如何更改 Ruby 的 atom-runner 路径?