如何正确使用 Promise?
Posted
技术标签:
【中文标题】如何正确使用 Promise?【英文标题】:How to use promises correctly? 【发布时间】:2017-10-19 08:31:21 【问题描述】:我有一个共享点表单,用户可以在其中填写一些文本框。
用户单击保存按钮。脚本从这里运行。
检查是否所有的texbox都被填满了。
如果不错,则根据输入从外部列表中获取一些字段,并根据该输入更新其他一些列表。
将输入保存为新项目。
问题:我使用了一个名为PreSaveAction()
的函数。这在用户单击“保存”按钮时调用,并且仅当返回 true
时才会保存表单。所以在返回true
之前我应该进行字段检查和列表更新,我不知道在哪里添加这个return true
。如果我直接在PreSaveAction()
中添加它,它正在运行 asyncron,因此在更新完成之前有 30-40% 的机会返回。我是 javascript 新手,所以我需要一点帮助。
我的简化代码如下所示:
function PreSaveAction() //This start if the user click on the save button, and create a new item if return with true
var promresult;
if(textbox!="")
//do my staff based on promise like: promresult=promise.then(input textbox, get list field).then(update).then(resolve true, fail false)
return promresult; //this run before the update is completed and promresult get value
else
return false; //nothing happens if the textboxes are not filled yet.
我阅读了有关promises 的信息,我想我了解它们的工作原理,但在我的情况下,PreSaveAction()
具有多种功能(检测 onclick、做我的工作、返回 true/false)。我尝试了几种方法,但我找不到解决方案在哪里以及如何从 presave 放置返回以等待我的承诺完成?还是我应该使用完全不同的方法?非常感谢您的热心帮助!
【问题讨论】:
如果没有看到函数中的实际异步代码,人们将无法帮助您。您似乎正在尝试从函数返回异步检索的值。你不能这样做。该值在函数返回时不可用。异步回调将在以后调用。 我简化了代码并试图专注于问题,因为我不想用冗长且难以理解的代码惹恼人们。但看起来你明白我的问题了。那么这是不可能的吗?你会用什么其他类型的解决方案来存档类似的东西?我的问题是这个“Presaveaction”是一个集成功能,我不知道如何将它拆分为组件。例如:如果我要使用简单的 onlcick 事件,在下一个函数中进行检查、更新列表,并在 3. 函数中强制保存,它会起作用吗? *** 不能很好地处理理论问题。它适用于实际代码和非常具体的问题。您问题的操作部分都在您的异步代码中,您没有共享任何代码,因此您的问题几乎完全是理论上的。鉴于此,我能提供的最佳答案是How do I return the response from an asynchronous call。 【参考方案1】:function PreSaveAction() //This start if the user click on the save button, and create a new item if return with true
var promresult;
if(textbox!="")
//do my staff based on promise like: promresult=promise.then(input textbox, get list field).then(update).then(resolve true, fail false)
return promresult; //this run before the update is completed and promresult get value
else
return Promise.resolve(false); //nothing happens if the textboxes are not filled yet.
PreSaveAction()
.then(function(result)
if (result===false)
// this means the textboxes are not filled yet
else
// result is whatever is returned from promresult
)
【讨论】:
嗨!我对其进行了测试,看起来 Presaveaction().then() 结构不起作用。你确定这与这样的承诺兼容吗?或者也许我是做错事的人,但我得到了“SyntaxError: Unexpected token ”。从这一行:( 也许“promresult”不是一个承诺。您没有发布实际的 promresult 代码,所以我真的不知道它是什么。那里的任何事情都可能是错误的以上是关于如何正确使用 Promise?的主要内容,如果未能解决你的问题,请参考以下文章
如何在打字稿中正确编写有条件的 promise.resolve?