javascript - 如何在我的计算器功能中实现承诺?
问题描述
我用 JavaScript 编写了一个类似计算器的应用程序,主要是为了让它可以在任何浏览器中运行。它有许多输入字段。当我按下计算按钮时,它会从这些字段中收集数据,调用各种函数并显示结果。没有异步的事情要做,没有可能延迟或失败的网络或磁盘获取,用户触发一个事件,然后必须等待直到产生答案。
下面的片段或多或少是这种过程的 Hello World。
<script type="text/javascript">
function transformer(instring)
{
var outstring = instring + instring;
return outstring;
}
function calculate()
{
var srcStr = document.mainform.src.value;
var transformed = transformer(srcStr);
document.mainform.dst.value = transformed;
}
</script>
<form name="mainform">
Input data <input type="text" name="src" value="abc"/><br>
<button type="button" onclick="javascript:calculate();">Calculate</button><br>
Output data <input type="text" name="dst" />
</form>
我想用返回承诺的库中的函数替换 transformer() 函数。为了实现这一点,我需要对代码进行最小的更改。我已经搜索了很多关于 Promise、异步函数、thens 等,但没有找到一个简单的“这里是如何在一个简单的事件驱动程序中使用 Promise”,而且我还没有设法编写一个与该程序等效的工作以上。一旦我有了一个工作的 hello world,我就可以从那里构建。
假设promise 总是会解决,reject 永远不需要处理。我所说的“最小变化”并不一定是指最少的字符,而是最容易理解或新概念最少的意思。
解决方案
要使用 Promise,您可以调用.then
它并指定在值可用后要运行的代码:
function transformer(instring)
{
var outstring = instring + instring;
return Promise.resolve(outstring);
}
function calculate()
{
var srcStr = document.mainform.src.value;
transformer(srcStr)
.then(transformed => {
document.mainform.dst.value = transformed;
});
}
或者,如果 async/await 是一个选项,您可以在 async 函数中使用 await 关键字。await 关键字将暂停你的函数并等待 promise 解决,然后恢复你的代码。这可以使语法更清晰,但仍涉及承诺。
async function calculate()
{
var srcStr = document.mainform.src.value;
var transformed = await transformer(srcStr);
document.mainform.dst.value = transformed;
}
推荐阅读
- r - 如何在 R 中查看用 c 编写的函数的底层代码?
- node.js - 如何将文件/图像从 React 发送到 node.js 服务器
- swift - 使用以编程方式创建的标签中的变量显示文本
- react-native - 如何在本机反应中从左到右打开布局或视图(从左到右滑动打开)?
- javascript - 在 JavaScript 中处理从 ajax 获取请求的文件下载
- angular-cli - 无法生成库。无效的规则结果:Promise 类的实例
- c# - .Net Core 如何使用 DI 服务新建一个类?
- c# - Newtonsoft 中的 com.google.gson.JsonArray
- haskell - 如何在仆人处理程序 monad 中处理异常?
- vue.js - 在 Nuxt 应用程序中关闭 webpack-hot-middleware 客户端覆盖