Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在计算器功能中实现承诺?_Javascript_Promise - Fatal编程技术网

Javascript 如何在计算器功能中实现承诺?

Javascript 如何在计算器功能中实现承诺?,javascript,promise,Javascript,Promise,我用JavaScript编写了一个类似计算器的应用程序,主要是为了让它可以在任何浏览器中运行。它有许多输入字段。当我按下calculate按钮时,它从这些字段收集数据,调用各种函数,并显示结果。没有异步的事情要做,没有可能延迟或失败的web或光盘获取,用户触发事件,然后必须等待直到生成答案 下面的片段或多或少是这种过程的Hello World <script type="text/javascript"> function transformer(instring) { va

我用JavaScript编写了一个类似计算器的应用程序,主要是为了让它可以在任何浏览器中运行。它有许多输入字段。当我按下calculate按钮时,它从这些字段收集数据,调用各种函数,并显示结果。没有异步的事情要做,没有可能延迟或失败的web或光盘获取,用户触发事件,然后必须等待直到生成答案

下面的片段或多或少是这种过程的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>

功能变压器(仪表)
{
var outstring=安装+安装;
回报突出;
}
函数计算()
{
var srcStr=document.mainform.src.value;
var转换=变压器(srcStr);
document.mainform.dst.value=已转换;
}
输入数据
计算
输出数据
我想将transformer()函数替换为一个库中返回承诺的函数。为了实现这一点,我需要对代码进行的最小更改是什么。我已经搜索了很多承诺、异步函数等,但没有找到一个简单的“下面是如何在简单的事件驱动程序中使用承诺”,我还没有成功地编写上述程序的等效工作。一旦我有了一个工作的hello世界,我就可以从那里开始构建


假设承诺总是会解决,拒绝永远不需要处理。我所说的“最小更改”并不一定意味着最少的字符,而是最容易理解的,或者使用最少的新概念。

假设
transformer
返回一个承诺,该承诺用转换后的字符串解析:

function calculate() {
    var srcStr = document.mainform.src.value;
    transformer(srcStr).then(function (transformed) {
        document.mainform.dst.value = transformed;
    });
}

要使用承诺,请调用
。然后对其调用
,并指定一旦该值可用时要运行的代码:

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是一个选项,则可以在异步函数中使用await关键字。wait关键字将暂停您的函数并等待承诺解决,然后恢复代码。这可以使语法更清晰,但仍然需要承诺

async function calculate()
{
    var srcStr = document.mainform.src.value;
    var transformed = await transformer(srcStr);
    document.mainform.dst.value = transformed; 
}

这是使用承诺的代码。注意结果端

功能变压器(仪表){
返回新承诺((解决、拒绝)=>{
常数超出=插入+插入;
决心(突出);
});
}
函数计算(){
var srcStr=document.querySelector('#src').value;
transformer(srcStr).then(result=>document.querySelector('#dst')。value=result);
}

输入数据
计算
输出数据
最简单的解决方案是将
变压器
设为一个内部计算(这也需要是一个
异步
函数)

异步函数转换器(instring){
var outstring=安装+安装;
回报突出;
}
异步函数计算(){
var srcStr=document.mainform.src.value;
var转换=等待变压器(srcStr);
document.mainform.dst.value=已转换;
}

输入数据
计算
输出数据
第一步返回一个承诺,第二步,使用它。@epascarello是的,我在搜索中读了好几遍,在代码中看到了它,它有我不理解或认为我需要的其他功能。如果transformer()返回的是承诺而不是提示值,那么在上面的代码中会是什么样子?
返回新承诺((resolve,reject)=>{resolve(whatYouWantToReturn);})
等待构造看起来非常有用。但你说“如果这是一个选择”。什么时候不可能?这将仅在新(ish)浏览器上运行。库函数中是否有任何东西会阻止在调用代码中使用wait?我该如何检查它呢?async/await是该语言最近添加的一个功能。现代浏览器支持它,但旧的浏览器不支持。您可以在此处查看支持它的详细信息:。如果您确实需要在这些浏览器上运行,您仍然可以使用async await编写代码,但是您的构建过程将需要有一个步骤将其转换为旧代码。