如何正确使用 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.all:未定义

如何在打字稿中正确编写有条件的 promise.resolve?

如何从 Promise 中获得结果?

如何使用 Promise 和 node.js 正确检查和记录 http 状态代码?

你如何正确地从 Promise 返回多个值?

如何使用链调用 Promise?