有关创建彼此依赖的异步调用的建议

时间:2016-02-03 16:26:27

标签: javascript asynchronous promise fluent method-chaining

我正在尝试创建一个库来对Web应用程序进行API调用(jira,如果你想知道)我的api调用工作没有问题,但我希望使代码更具可读性和使用-能够。我试图寻找我的需求,但事实证明我不确定我需要搜索什么。

我遇到了依赖彼此的异步调用的问题,我知道我必须等到回调运行才能运行我的下一个项目,但我不确定设计它的最佳方法。

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

createProject(jsonProjectStuff)
  .setLeadUser("myusername")
  .createBoard("boardName")
     .setBoardPermissions(boardPermissionJSONvar)
  .addRole(personRoleJSONvar);

使用此示例,所有内容都必须等待createProject,因为它将返回项目。 createBoard通常不依赖于项目,但在此背景下使用它应该被分配"对于所制作的项目,设置电路板权限仅依赖于createBoard才能工作。 addRole再次针对该项目。

我的问题是:

  1. 这样可以切换这样的上下文并将数据保存在它们之间,而无需从硬编码的响应中运行该函数吗?
  2. 如果可以的话,这是个好主意吗?如果不是,我对其他计划持开放态度。
  3. 我可以想到几种方法让它工作,包括使用依赖树注册函数调用,然后在我们去的时候履行承诺,虽然这对我来说主要是概念性的,因为我试图决定最好的

    编辑2016年2月19日

    所以我更多地研究了这个问题,然后我决定选择性的"然后"只有在创建新项目时才与父项直接相关。

    //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})
       )
    

    我非常喜欢这个解决方案,我唯一不确定该怎么做的是字符串"变量",我想它可能是"Blah blah Name " + this.project.key 无论哪种方式,我都不确定如何通过"然后" copyBoardsaveFilterAs访问它。功能

    有什么想法吗?

1 个答案:

答案 0 :(得分:-1)

我最近一直在使用Nightmare(无头浏览器)。

它有一个流畅的API,使用了漂亮的设计模式。

调用API并不直接执行操作,只有队列它们,当您准备好执行时,必须调用返回promise的end函数。当队列完成异步执行时,将解除promise。

例如,在你的情况下

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(或其他)。然后,异步完成操作序列,并使用promise来处理完成和错误。