当前位置: 首页 > 知识库问答 >
问题:

同步解析链式Angular Promises[重复]

司寇飞航
2023-03-14

我有一个解决promise函数,它使用$q服务,其中有一些通用代码来解决/拒绝基于某些条件。我有一个场景,其中只有在api1被成功解析后,我才必须执行api2。但是这两个调用都是异步发生的。我已经在下面粘贴了伪代码。请帮忙。提前多谢了。

var resolvePromise = function(promise)
{
    var defer = $q.defer();
    promise.then(function(response)
        if(certain conditions are true)
        {
             defer.reject(err)
        }
        defer.resolve();
    )
    .catch(function(errors){
        defer.reject(errors);
    })

   return defer.promise;
}

function synchronousCalls()
{
    var promise1 = service.getApi1();
    var promise2 = service.getApi2();

    return resolvePromise(promise1).then(function(){
          return resolvePromise(promise2);
    })
}

function getData()
{
    synchronousCalls().then(function(){
       console.log("synchronous run of apis ended");
    })
}

共有2个答案

凌声
2023-03-14

synchronousCalls更改为

function synchronousCalls()
{
    return service.getApi1().then(resolvePromise).then(service.getApi2).then(resolvePromise);
}
轩辕晔
2023-03-14

您不需要resolvePromise函数。让getApi1getApi2直接返回promises您可以。然后()。此外,对返回Promises的函数的调用不会停止执行上下文。您将立即启动对这两个API的调用,而不是等待第一个API完成。您需要调用getApi1(),然后()从中返回的Promise。考虑下面的代码:

// This says, fire them both immediately
var promise1 = service.getApi1();
var promise2 = service.getApi2();

// Your call should look something like this
service
    .getApi1()
    .then(function (api1Response) {
        // If I'm in here, I know that the request to service 1 is done
        return service
            .getApi2();
    }).then(function (api2Response) {
        // If I'm in here, I know that the request to service 2 is done
        console.log(api2Response);
    })
    .catch(function (err) {
        console.log("Something has gone wrong");
    });

你们两个getApi函数应该是这样的,它们所做的主要事情是用.then()方法返回一些东西(比如Promise)。

function getApi1() {
    // This is returning a Promise
    return $http
        .get("some/resource/on/the/server.json")
        .then(function (response) {
            /*
             * Here I'm just peeling out the data from the response
             * because I don't actually care about the details of the
             * response, just the data
             */
            return response.data;
        });
}

 类似资料:
  • 主要内容:1 ConcurrentLinkedQueue的概述,2 ConcurrentLinkedQueue的实现,2.1 基本结构,2.2 构造器,2.3 入队操作,2.4 出队操作,2.5 过程详解,2.6 获取操作,2.7 其他操作,3 ConcurrentLinkedQueue的总结基于JDK1.8详细介绍了ConcurrentLinkedQueue的底层源码实现,包括同步原理、入队操作、出队操作、获取操作等。 1 ConcurrentLinkedQueue的概述 public cla

  • 驴你看,我要添加截取到我的应用程序添加这行代码com.mcxioke。截取:库aar:1.0.0建立。gradle文件 我也试着添加改装。但它给出了相同类型的错误:未能解决:bla bla bla。 所以我认为在我的情况下gradle不能同步任何其他库不同于com.android....... 我也尝试将这行代码添加到我的build.gradle。但是什么都没有改变 请指教 编辑:添加注释后生成。

  • 问题内容: 这个问题已经在这里有了答案 : 在一致之前如何理解发生的事情 (4个答案) 2年前关闭。 我试图理解Java 发生在订单概念之前的事情,并且有些事情似乎非常令人困惑。据我所知,之前发生的只是一系列动作的顺序,并不提供有关实时执行顺序的任何保证。实际上(强调我的): 应该注意的是,两个动作之间存在先发生关系并不一定意味着在实现中它们必须按照该顺序进行。 如果重新排序产生的 结果与合法执行

  • 本文向大家介绍Ajax同步和异步问题浅析及解决方法,包括了Ajax同步和异步问题浅析及解决方法的使用技巧和注意事项,需要的朋友参考一下 通过ajax向后台发送和接收数据时,常常会出现同步异步问题。由于ajax是默认异步加载的,但有时候需要同步或者同步的效果,有以下两种解决方案。 方案一:将某些方法放在回调函数中执行,即,等到从后台返回成功后再执行。 例: 红色的部分必须在数据返回成功后执行,如果放

  • 我试图使用Firebase动态链接在应用程序中打开屏幕,如下所示: 有办法避免这种情况吗?我可以同步提取深度链接吗?当我已经安装时,我确实看到了intent.data参数,但是在新安装后,数据为null,并且只有firebase回调工作。如果意图有空额外项,它如何工作?有网络检查什么的吗? 谢谢

  • 我想更多地了解线程睡眠解析是如何工作的,以及它与睡眠()解析之外的内容有什么联系。 我知道它是由操作系统定义的,而在Windows上通常是15ms。我最近环顾四周无法确认这一点,但我依稀记得这个15ms是由操作系统循环的,并且对所有线程都是“全局的”,这意味着15ms不是线程可以Hibernate的最短时间,而是最大Hibernate时间(1)。对吗?所有操作系统都一样吗(超过持续时间)? 我想不