Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.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_Asynchronous_Promise_Fluent_Method Chaining - Fatal编程技术网

Javascript 关于创建相互依赖的异步调用的建议

Javascript 关于创建相互依赖的异步调用的建议,javascript,asynchronous,promise,fluent,method-chaining,Javascript,Asynchronous,Promise,Fluent,Method Chaining,我正在尝试创建一个库来对web应用程序进行API调用(jira,如果你想知道的话),我的API调用工作没有问题,但我希望使代码更具可读性和可使用性。我试着寻找我的需要,但结果我不确定我需要寻找什么 我对相互依赖的异步调用有一个问题,我知道我必须等到运行回调才能运行下一项,但我不确定设计它的最佳方法 我真的很想让链接成为api的一个功能,我希望它看起来像这样: createProject(jsonProjectStuff) .setLeadUser("myusername") .creat

我正在尝试创建一个库来对web应用程序进行API调用(jira,如果你想知道的话),我的API调用工作没有问题,但我希望使代码更具可读性和可使用性。我试着寻找我的需要,但结果我不确定我需要寻找什么

我对相互依赖的异步调用有一个问题,我知道我必须等到运行回调才能运行下一项,但我不确定设计它的最佳方法

我真的很想让链接成为api的一个功能,我希望它看起来像这样:

createProject(jsonProjectStuff)
  .setLeadUser("myusername")
  .createBoard("boardName")
     .setBoardPermissions(boardPermissionJSONvar)
  .addRole(personRoleJSONvar);
在本例中,一切都必须等待
createProject
,因为它将返回项目
createBoard
通常不依赖于项目,但在这种情况下,它应该“分配”给所做的项目,设置板权限仅依赖于
createBoard
来工作<代码>添加角色再次特定于项目

我的问题是:

  • 这是否可以像这样切换上下文并在它们之间保留数据,而不需要从硬编码的响应运行函数
  • 如果可能的话,这是个好主意吗?如果不是,我愿意接受其他计划
  • 我可以想出两种方法来实现它,包括用依赖关系树注册函数调用,然后在执行过程中兑现承诺,尽管这对我来说基本上是概念性的,因为我正在尝试确定最佳方案

    编辑2016年2月19日

    因此,我对此进行了更多的研究,并决定只有在创建新项目与父项没有直接关系时才选择“then”

    //Numbers are ID, string is Name
    copyProject(IDorName)
      .setRoles(JSONItem)
      .setOwner("Project.Owner")
      .setDefaultEmail("noreply@fake.com")
      .then(
         copyBoard(IDorName)
           .setName("Blah blah Name {project.key}"),
    
         saveFilterAs(IDorName, "Board {project.key}", 
                      "project = {project.key} ORDER BY Rank ASC")
           .setFilterPermissions({shareValuesJSON})
       )
    
    我非常喜欢这个解决方案,唯一不确定的是字符串“variables”,我想它可能是
    “Blah Blah Name”+this.project.key
    无论哪种方式,我都不确定如何通过“then”功能授予
    复印机
    savefiltera
    访问权限

    有什么想法吗?

    我最近一直在使用噩梦(无头浏览器)

    它有一个使用良好设计模式的流畅API

    调用API不会直接执行操作,它只对操作进行排队,当您准备执行时,必须调用
    end
    函数,该函数返回一个承诺。当队列完成异步执行时,将解析承诺

    例如,在你的情况下

    createProject(jsonProjectStuff)
        .setLeadUser("myusername")
        .createBoard("boardName")
        .setBoardPermissions(boardPermissionJSONvar)
        .addRole(personRoleJSONvar)
        .end() // Execute the queue of operations.
        .then() => {
            // All operations completed.
        ))
        .catch(err => {
            // An error occurred.
        });
    

    我觉得这个图案很优雅。它允许您使用流畅的API来构建一系列操作。然后,当您准备好执行上述操作时,您可以调用
    end
    (或其他)。然后异步完成操作序列,您可以使用承诺来处理完成和错误。

    这似乎是个好主意。。。您可以存储最后一个承诺,对于调用的每个函数,您可以链接到最后一个承诺,并更新最后一个承诺变量。@JoaozitoPolo如果调用一个函数4 deep,需要第一次调用的变量,你介意展示一个简单的例子,这样我可以根据自己的需要修改和使用它吗?相关:。本质上,javascript足够灵活,可以支持您想象的任何异步流畅模式,但它们不一定是性能良好或易于实现的。我们仍在为此使用事件系统,但我期待着反应式编程检查,您可以在其中观察和执行subscribe@Krum110487:给定箭头函数,上下文并不是什么问题。一般来说,我认为让实例的状态与承诺相关联是一个坏主意,而不是为具有定义良好的状态的实例做出承诺(另请参见)。当然,这对实例上的方法链接是有害的;尽管如此,如果您坚持使用流畅的接口,您不应该放弃这一原则,而是应该围绕实例的承诺构建第二个类,并为其提供可链接的方法。